CRM HubSpot Technologia

HubSpot API – limity i rate limiting. Jak projektować integracje, które nie zatrzymają Twojego biznesu?

Integracja działa świetnie. Do momentu, w którym nagle przestaje.

CRM przestaje otrzymywać dane z formularza. Umowa nie trafia do klienta. Status płatności nie aktualizuje się w HubSpot. System ERP ma nowe informacje, ale CRM nadal pokazuje dane sprzed kilku godzin.

W logach pojawia się

429 Too Many Requests

I właśnie wtedy okazuje się, że samo „połączenie dwóch systemów przez API” to za mało.

Dobrze zaprojektowana integracja musi wiedzieć nie tylko co wysłać do HubSpot, ale również kiedy, jak często i co zrobić, jeśli HubSpot chwilowo nie przyjmie kolejnego żądania.

I właśnie tutaj pojawia się rate limiting.

 

Czym jest rate limiting w HubSpot?

Każde wywołanie API to żądanie wysyłane przez zewnętrzny system do HubSpot.

Może to być na przykład:

  • pobranie kontaktu,
  • utworzenie firmy,
  • aktualizacja deala,
  • wyszukanie rekordu,
  • pobranie właściciela,
  • utworzenie powiązania pomiędzy obiektami,
  • aktualizacja własnego obiektu CRM.

Jeżeli integracja wykonuje kilka takich operacji dziennie, limity praktycznie nie są zauważalne.

Problem zaczyna się wtedy, gdy system obsługuje setki lub tysiące rekordów albo kilka aplikacji jednocześnie korzysta z tego samego konta HubSpot.

HubSpot ogranicza liczbę zapytań, które można wykonać w określonym czasie.

Rate limiting jest mechanizmem bezpieczeństwa, który chroni infrastrukturę przed sytuacją, w której jedna aplikacja wygenerowałaby ogromną liczbę zapytań i wpłynęła na działanie całej platformy.

 

Jakie są limity HubSpot API?

W praktyce warto zwrócić uwagę przede wszystkim na dwa rodzaje limitów: krótkookresowy oraz dzienny.

Limit krótkookresowy

Burst limit

Określa, ile zapytań aplikacja może wykonać w krótkim przedziale czasu.

Limit dzienny

Dzienna liczba wywołań API

Określa, ile zapytań może zostać wykonanych w ciągu dnia w ramach dostępnego limitu konta.

Dla prywatnie dystrybuowanych aplikacji ogólne limity wyglądają następująco:

Porównanie limitów według planu HubSpot

Plan HubSpot Limit na 10 sekund Limit dzienny
Free / Starter 100 zapytań 250 000
Professional 190 zapytań 625 000
Enterprise 190 zapytań 1 000 000

W przypadku API Limit Increase limit krótkookresowy może zostać zwiększony, podobnie jak dostępny limit dzienny.

Najważniejsza różnica wygląda jednak tak:

Burst limit jest liczony per aplikacja, natomiast limit dzienny jest współdzielony pomiędzy aplikacjami działającymi na tym samym koncie HubSpot.

I właśnie ten drugi element potrafi powodować niespodzianki.

Limity HubSpot API i rate limiting
 

Czy kilka integracji współdzieli limit HubSpot API?

Wyobraźmy sobie firmę posiadającą:

  • integrację ERP z HubSpot,
  • synchronizację systemu fakturowego,
  • automatyczne generowanie umów,
  • synchronizację danych z hurtownią,
  • dodatkową aplikację raportową.

Każda z nich osobno może generować rozsądną liczbę zapytań.

Problem pojawia się wtedy, gdy patrzymy na cały ekosystem.

Jeżeli kilka integracji intensywnie synchronizuje dane, kolejna może zacząć otrzymywać błędy mimo tego, że sama wykonuje stosunkowo niewiele operacji.

Dlatego projektując architekturę HubSpot, nie patrzymy na pojedynczy skrypt.

Patrzymy na cały ruch generowany przez systemy firmy.

Współdzielony ruch integracji HubSpot API
 

429 Too Many Requests – co oznacza ten błąd w HubSpot?

Jeżeli aplikacja przekroczy dostępny limit, HubSpot może zwrócić:

HTTP 429 Too Many Requests

Nie powinno to automatycznie oznaczać awarii integracji.

W praktyce oznacza:

„Zwolnij. Spróbuj ponownie później.”

I tutaj bardzo łatwo odróżnić integrację przygotowaną do pracy produkcyjnej od prostego skryptu.

Najgorszy możliwy mechanizm wygląda tak:

Błędna obsługa 429

01
 

HubSpot zwraca 429

aplikacja przekroczyła dostępny limit

02
 

Aplikacja od razu ponawia żądanie

nie daje API czasu na odzyskanie dostępnego limitu

03
 

HubSpot ponownie zwraca 429

problem nadal występuje

04
 

Aplikacja ponawia żądanie kolejny raz

liczba requestów jeszcze bardziej rośnie

05

Ruch się kumuluje

system sam pogłębia problem, przed którym próbuje się obronić

System sam pogłębia problem, przed którym próbuje się obronić.

 

Retry i exponential backoff – jak obsłużyć błąd 429?

Integracja powinna posiadać mechanizm ponawiania nieudanych operacji.

Nie oznacza to jednak próbowania ponownie co sekundę aż do skutku.

Dobrym rozwiązaniem jest exponential backoff.

Przykładowo:

Exponential backoff

01
 

Pierwsza próba

wykonana od razu

02
 

Druga próba

po 2 sekundach, jeśli poprzednia zakończyła się błędem 429

03
 

Trzecia próba

po 4 sekundach, jeśli limit nadal jest przekroczony

04

Czwarta próba

po 8 sekundach

Przerwa pomiędzy kolejnymi próbami stopniowo rośnie.

W systemach działających na większą skalę warto również dodać tzw. jitter, czyli niewielkie losowe przesunięcie czasu ponowienia.

Jeżeli 20 workerów jednocześnie otrzyma 429 i wszystkie spróbują ponownie dokładnie po dwóch sekundach, HubSpot ponownie otrzyma falę requestów w tym samym momencie.

Jitter pozwala rozproszyć ruch w czasie.

 

Kolejka zadań zamiast wyścigu requestów

Kolejka zadań i rate limiting HubSpot API

Przy większych automatyzacjach znacznie bezpieczniejszy model wygląda tak:

Przepływ zadania

01
 

Zdarzenie

proces biznesowy uruchamia zadanie

02
 

Kolejka

zadanie czeka na bezpieczne wykonanie

03
 

Worker

pobiera i przetwarza zadanie

04
 

Rate limiter

kontroluje tempo wywołań API

05
 

HubSpot API

wykonuje operację

06

Sukces

zadanie zostaje zakończone

Jeżeli HubSpot chwilowo nie może przyjąć kolejnego zapytania:

Obsługa błędu 429

01
 

Błąd 429

HubSpot chwilowo odrzuca kolejne żądanie

02
 

Retry

system wyznacza właściwy moment ponowienia

03
 

Kolejka

zadanie wraca do oczekiwania

04

Ponowna próba

operacja zostaje wykonana ponownie

Dzięki temu proces biznesowy nie znika tylko dlatego, że API przez kilka sekund nie przyjęło kolejnego requestu.

To szczególnie ważne przy procesach takich jak:

  • generowanie dokumentów,
  • aktualizacja statusów umów,
  • synchronizacja ERP,
  • obsługa płatności,
  • tworzenie kontaktów,
  • wysyłanie komunikacji,
  • synchronizacja dużych baz danych.

System ma prowadzić proces, a nie wymagać od człowieka pilnowania, czy każdy request zakończył się kodem 200.

 

Batch API – czy naprawdę potrzebujesz requestu dla każdego rekordu?

Drugim częstym problemem nie jest sam limit.

Jest nim sposób napisania integracji.

Załóżmy, że musimy zaktualizować 1000 kontaktów.

Najprostsze rozwiązanie wygląda tak:

Operacje wykonywane rekord po rekordzie

Kontakt 1: GET, a następnie PATCH
Kontakt 2: GET, a następnie PATCH
Kontakt 3: GET, a następnie PATCH
...

Bardzo szybko generujemy tysiące operacji.

HubSpot udostępnia jednak endpointy batchowe, dzięki którym wiele rekordów można obsłużyć w jednym żądaniu.

Dlatego przy projektowaniu większych integracji zawsze warto sprawdzić:

Czy naprawdę potrzebujemy wykonać osobny request dla każdego rekordu?

Czasem kilkaset wywołań można zastąpić kilkoma.

Oznacza to:

  • mniejsze wykorzystanie limitów,
  • szybszą synchronizację,
  • mniejszą liczbę potencjalnych błędów,
  • mniejsze obciążenie własnej infrastruktury.
 

Cache – najdroższy request to ten, którego nie trzeba było wykonać

Wyobraźmy sobie aplikację, która przy każdej operacji pobiera z HubSpot:

  • listę właścicieli,
  • definicje właściwości,
  • konfigurację pipeline'u,
  • informacje o obiekcie.

Jeżeli dane praktycznie się nie zmieniają, nie ma sensu pobierać ich setki razy.

Można wykorzystać cache.

Sprawdzenie cache

01
 

Sprawdź cache

aplikacja najpierw szuka danych lokalnie

02
 

Dane są dostępne

użyj ich bez wykonywania kolejnego requestu do HubSpot

03

Danych nie ma

pobierz je z HubSpot, a następnie zapisz w cache

To jedna z najprostszych metod ograniczenia liczby zapytań.

 

Webhook czy polling?

Webhook i polling w integracji HubSpot API

Kolejny klasyczny przykład.

Chcemy dowiedzieć się, czy kontakt został zmieniony.

Możemy sprawdzać HubSpot regularnie:

Polling

01
 

Pierwsze sprawdzenie

po 30 sekundach

02
 

Kolejne sprawdzenie

po następnych 30 sekundach

03

Następne sprawdzenie

i tak dalej, nawet jeśli żadne dane się nie zmieniły

To polling.

System nie wie, czy cokolwiek się wydarzyło, więc cały czas pyta.

Przy jednej integracji może nie być problemu. Przy tysiącach rekordów robi się kosztownie.

Alternatywą są webhooki.

Webhook

01
 

HubSpot

wykrywa zmianę kontaktu

02
 

Webhook

przekazuje informację o zdarzeniu

03

Nasza aplikacja

wykonuje odpowiednią operację

Zamiast regularnie pytać system:

„Czy już coś się zmieniło?”

czekamy, aż system sam poinformuje nas o zmianie.

W dobrze zaprojektowanej architekturze webhooki obsługują zdarzenia na bieżąco, a synchronizacja okresowa pełni funkcję kontrolną.

 

CRM Search API ma własne limity

Warto zwrócić szczególną uwagę na endpointy wyszukiwania CRM.

CRM Search API posiada bardziej restrykcyjne limity niż ogólne API HubSpot.

Obecnie Search API może obsługiwać do 5 zapytań na sekundę, a pojedyncza strona odpowiedzi może zawierać maksymalnie 200 rekordów.

To istotne, ponieważ wyszukiwanie rekordów bardzo łatwo trafia do pętli.

Przykład:

Dla każdego zamówienia

01
 

Kontakt

wyszukaj rekord po adresie e-mail

02
 

Firma

wyszukaj rekord po NIP

03

Deal

wyszukaj odpowiednią transakcję

Przy większym imporcie szybko może okazać się, że to właśnie Search API, a nie ogólny limit konta, jest pierwszym wąskim gardłem.

Dlatego architektura integracji powinna uwzględniać limity konkretnych endpointów, a nie tylko globalny limit HubSpot.

 

Czy zwiększenie limitu HubSpot API rozwiązuje problem?

Czasami tak.

HubSpot oferuje możliwość zwiększenia dostępnych limitów API.

Ale zakup większego limitu nie powinien być pierwszą reakcją.

Jeżeli aplikacja wykonuje 500 000 requestów, z których 300 000 jest niepotrzebnych, większy limit nie naprawia architektury.

Pozwala jej tylko dłużej działać w nieefektywny sposób.

Zanim zwiększymy limit, warto sprawdzić:

  • czy można zastosować batch API,
  • czy nie odpytujemy ciągle tych samych danych,
  • czy możemy zastosować cache,
  • czy polling można zastąpić webhookami,
  • czy wszystkie requesty są naprawdę potrzebne,
  • czy integracje nie wykonują tej samej pracy niezależnie od siebie.

Dopiero później warto analizować zwiększenie dostępnej przepustowości.

 

Monitoring HubSpot API powinien być częścią integracji

Dobrze zaprojektowana integracja nie czeka na moment, w którym biznes zauważy problem.

HubSpot zwraca między innymi nagłówki pozwalające kontrolować dostępny limit:

Nagłówki limitów

X-HubSpot-RateLimit-Max
X-HubSpot-RateLimit-Remaining
X-HubSpot-RateLimit-Interval-Milliseconds

Można dzięki nim kontrolować, ile zapytań pozostało w aktualnym oknie czasowym.

HubSpot udostępnia również monitoring wykorzystania API bezpośrednio w platformie.

Dzięki temu można obserwować trendy, wykrywać nietypowe skoki wykorzystania i reagować zanim integracje zaczną otrzymywać błędy 429.

Bo jeżeli o przekroczeniu limitu dowiadujemy się od handlowca, który mówi:

„Od rana nie aktualizują mi się deale.”

to monitoring zadziałał zdecydowanie za późno.

 

Rate limiting to nie problem API, tylko architektury.

Limitów nie da się całkowicie wyeliminować.

Można natomiast zaprojektować system tak, aby użytkownik praktycznie ich nie zauważał.

Dobra integracja HubSpot powinna posiadać:

  • kontrolę tempa wysyłania requestów,
  • obsługę błędów 429,
  • retry z exponential backoff,
  • kolejkę zadań,
  • mechanizm idempotencji,
  • monitoring,
  • cache,
  • wykorzystanie endpointów batchowych,
  • webhooki tam, gdzie jest to uzasadnione,
  • mechanizm odzyskiwania zadań, które nie zostały wykonane.

Wtedy chwilowe przekroczenie limitu nie zatrzymuje procesu.

Zadanie trafia do kolejki, system zwalnia, wykonuje je ponownie i kontynuuje pracę.

Bez Excela. Bez ręcznego poprawiania danych. Bez osoby sprawdzającej codziennie rano, czy „integracja nadal działa”.

 

Integracja HubSpot powinna skalować się razem z biznesem

Integrację można zbudować tak, aby działała dzisiaj.

Można też zaprojektować ją tak, aby nadal działała wtedy, gdy liczba klientów, transakcji i automatyzacji wzrośnie pięciokrotnie.

To dwie zupełnie różne rzeczy.

W Velmanta projektujemy integracje HubSpot jako część całej architektury procesów firmy.

Analizujemy nie tylko jak połączyć system A z systemem B, ale przede wszystkim jak dane mają przepływać przez organizację, żeby proces działał stabilnie również wtedy, gdy firma zwiększy skalę.

Bo dobrze zaprojektowane API powinno być niewidoczne.

Dane po prostu trafiają tam, gdzie powinny. Procesy wykonują się automatycznie. A technologia wspiera ludzi zamiast tworzyć kolejne miejsce, którego ktoś musi pilnować.

 

Najczęściej zadawane pytania o limity HubSpot API

Co oznacza błąd 429 w HubSpot?

Błąd 429 Too Many Requests oznacza, że aplikacja przekroczyła dostępny limit wywołań API. Integracja powinna wtedy ograniczyć tempo requestów i ponowić operację zgodnie z odpowiednią strategią retry.

Ile requestów można wykonać do HubSpot API?

Limit zależy od planu HubSpot, rodzaju aplikacji oraz dostępnych rozszerzeń. Dla prywatnie dystrybuowanych aplikacji limity krótkookresowe i dzienne różnią się w zależności od posiadanej wersji HubSpot.

Jak uniknąć błędu 429 w HubSpot?

Najczęściej stosuje się rate limiting po stronie aplikacji, kolejki zadań, retry z exponential backoff, batch API, cache oraz webhooki zamiast nadmiernego pollingu.

Czy HubSpot Search API ma osobny limit?

Tak. CRM Search API posiada własne ograniczenia i dlatego przy większych synchronizacjach powinno być traktowane osobno od ogólnych limitów API HubSpot.

Czy można zwiększyć limit HubSpot API?

Tak, HubSpot oferuje możliwość zwiększenia dostępnych limitów. Zanim jednak zwiększymy limit, warto najpierw sprawdzić, czy integracja nie wykonuje zbędnych lub powtarzających się requestów.

Udostępnij

Komentarze