Limity a CORS#
Omezení počtu požadavků#
Platí tři vrstvy: limity aplikace, limity volajícího pod nimi a zvláštní limity na vybraných citlivých endpointech.
Limity pro aplikaci#
Každý klíč aplikace má vlastní limity: krátké okno za sekundu a delší za minutu. Výchozí hodnoty jsou 20 za sekundu a 600 za minutu; provozovatel je u konkrétního klienta může nastavit jinak.
Limit aplikace sdílejí všichni její uživatelé
Překročí-li aplikace svůj limit, jsou odmítnuti všichni její uživatelé, dokud okno neskončí. Jeden přetížený uživatel (nebo chybná smyčka) tedy může zastavit celou aplikaci. Proto existují limity volajícího.
Limity volajícího#
Pod stropem aplikace platí limit na volajícího, aby jeden volající nevyčerpal celou kapacitu:
| Volající | Počítá se podle | Výchozí limit |
|---|---|---|
| přihlášený uživatel | účtu z tokenu | 120 za minutu |
| nepřihlášený (bez tokenu) | adresy IP | 120 za minutu |
Podle adresy se počítají i veřejné akce, které token nečtou (přihlášení, obnova tokenu, zapomenuté heslo) — i když token pošlete. Administrátor webu může oba limity u aplikace změnit.
Neplatný token na limit volajícího nedojde
Neplatný nebo vypršelý token skončí chybou 401 dřív, než se limit volajícího počítá. Limit aplikace se ale započítá i tak.
Okna a překročení#
Okna jsou pevná: s novou sekundou, respektive minutou začíná nové okno a počítadlo
se vynuluje. Překročený limit (aplikace i volajícího) vrací HTTP 429, hlavičku
Retry-After s počtem sekund do konce okna a tělo:
code 404 je kód výsledku RATE_LIMIT_EXCEEDED, ne stavový kód HTTP. data.retryAfter
nese totéž číslo jako hlavička. Klient má počkat Retry-After sekund a teprve pak opakovat.
Zvláštní limity endpointů#
Platí navíc k limitům výše — přihlášení, obnova tokenu, obnova hesla, odhalení telefonu, zakládání obsahu a další. Limit není globální, tyto platí jen na vybrané citlivé endpointy.
| Endpoint | Klíč | Limit | Po překročení |
|---|---|---|---|
auth/login |
jméno a adresa, jen neúspěšné pokusy | 5 za 5 minut | 429 s Retry-After, kód 404 |
auth/login |
účet ze všech adres, jen neúspěšné pokusy | 20 za hodinu | 429 s Retry-After, kód 404 |
auth/refresh |
adresa, každý pokus | 30 za 5 minut | 429 s Retry-After, kód 404 |
user/update-password |
účet, jen špatné současné heslo | 5 za 5 minut | HTTP 200, kód 404 |
user/show-phone |
adresa | 20 za hodinu | HTTP 200, prázdný phone |
user/send-new-password |
adresa / uživatel | 10 za hodinu / 3 za hodinu | HTTP 200, stejná odpověď jako při úspěchu |
user/reset-password |
adresa | 10 za hodinu | HTTP 200, kód 112 |
user/send-activation-email |
adresa / uživatel | 10 za hodinu / 3 za hodinu | HTTP 200, stejná odpověď jako při úspěchu |
Limit přihlášení a obnovy tokenu vrací HTTP 429, hlavičku Retry-After a tělo se
stejnými klíči, jen zpráva nese i počet sekund:
Rozhodujte podle code a data.retryAfter, ne podle textu zprávy.
Přihlášení z neznámého zařízení
Limit 20 za hodinu na účet a limity na dvojice (jméno nebo účet, adresa) platí
plně jen pro neznámé zařízení: nad limitem se heslo vůbec neověřuje a klient
dostane stejné 429 jako dřív. Prohlížeč, který se k účtu už přihlásil, je rozpoznán
podepsanou cookie webu, a adresa s úspěšným přihlášením v posledních 30 dnech projde
přes limit účtu. Externí volání auth/login cookie neposílá, takže je vždy
neznámé zařízení; pomoci mu může jen adresa, ze které se účet nedávno úspěšně
přihlásil. Integrace proto nemá při zablokovaném účtu čekat na uvolnění z jiné adresy:
má se řídit hlavičkou Retry-After.
Odpověď při zaškrcení nesmí prozradit víc než odpověď při průchodu
Proto „zapomenuté heslo“ vrací při limitu stejný úspěch jako bez něj a obnova hesla týž kód jako neplatný klíč. Jen přihlášení a obnova tokenu hlásí limit stavovým kódem 429.
Kvóta zakládání obsahu#
Zakládání vybraného obsahu má horní mez počtu za hodinu. Platí stejně pro web i pro
externí save s tokenem.
| Co | Klíč | Limit |
|---|---|---|
| odpověď na inzerát a na firemní profil, příspěvek a nahlášení v diskuzi, komentář, nahlášení inzerátu, kontaktní zpráva — přihlášený uživatel | uživatel / adresa, zvlášť pro každý druh obsahu | 30 za hodinu / 60 za hodinu |
| kontaktní zpráva — nepřihlášený návštěvník | e-mail z formuláře / adresa | 5 za hodinu / 20 za hodinu |
| aktivační e-mail odběru novinek | adresa / e-mail | 10 za hodinu / 3 za hodinu |
Počítá se jen vložení, úprava ne. Nad limitem vrátí save HTTP 200, success: false
a kód 404 se zprávou Too many new records, try again later. — bez hlavičky
Retry-After. Administrátor kvótě nepodléhá.
Na běžné čtení a zápis platí jen limity aplikace a volajícího
Zvláštní limit nemají. Neznamená to ale, že si můžete dovolit cokoli — velké includes
a časté dotazy zatíží server stejně.
Neúspěšná přihlášení se počítají, úspěšná ne
Správně přihlášený klient na limit nenarazí.
CORS#
Týká se jen volání z prohlížeče. Požadavek ze serveru CORS neomezuje.
| Nastavení | Hodnota |
|---|---|
| Povolené původy | seznam, výchozí jen místní adresy pro vývoj |
| Metody | GET, POST, PUT, PATCH, DELETE, OPTIONS |
| Hlavičky | Authorization, X-API-Key, Content-Type, X-Requested-With, Accept |
| Zveřejněné hlavičky | žádné |
| Přihlašovací údaje | povoleny |
| Platnost předběžného dotazu | 1 hodina |
X-API-Key je povolená hlavička
Předběžný dotaz prohlížeče ji povoluje. Klíč vložený do skriptu v prohlížeči ale není tajný — viz Autentizace.
Vaše doména musí být na seznamu
Není-li tam, server odpoví, ale prohlížeč odpověď zahodí. Vypadá to jako výpadek API. Požádejte provozovatele o zapsání domény.
Retry-After z prohlížeče nepřečtete
Hlavička není zveřejněná. Při limitu tedy v prohlížeči nezjistíte, jak dlouho
čekat — počítejte s vlastním odstupem. Tělo odpovědi ale nese data.retryAfter.
Předběžný dotaz#
Dotaz metodou OPTIONS se odbaví ještě před autentizací a vrátí 204. Při
nepovoleném původu vrátí 204 bez povolovací hlavičky.
Doporučení pro klienta#
Při 429 čekejte Retry-After sekund
Opakování hned limit jen prodlouží. Nemáte-li hlavičku k dispozici (prohlížeč), čekejte s narůstajícím odstupem.
Token obnovujte předem, ne až na 401
Přístupový token platí 15 minut. Obnova s minutovým předstihem ušetří zbytečné neúspěšné požadavky.
Nepoužívejte includes=*
Nejrychlejší způsob, jak si zpomalit vlastní integraci.