RO

Tema

Culoarea de accent

Tema și culoarea te urmează pe satelit.md și în aplicație.

Panou Alege un plan

Credite și limite

Două limite separate: creditele pe lună, care sunt cota ta, și apelurile pe minut, care protejează serviciul.

Creditele

  • Un răspuns mic din baza de date costă 1 credit. Costul fiecărei rute este în tabelul de prețuri.
  • Creditele se scad doar la un răspuns 2xx. O eroare nu costă nimic.
  • Se resetează în prima zi a perioadei tale, o dată pe lună. Ce nu ai folosit nu se reportează.
  • Peste cotă primești 429 quota_exceeded. API-ul se oprește și nu apare nicio factură.

Limita pe minut

Fiecare plan are o limită pe minut. Peste ea primești 429 rate_limited, cu antetul Retry-After.

Limitele pe plan

Credite pe lunăApeluri pe minutIstoric
Start5 0003030 de zile
Creator30 00012090 de zile
Pro300 000600365 de zile
Business3 000 0001 800tot
Enterpriseprin contractprin contracttot

Antetele fiecărui răspuns

AntetCe spune
X-RateLimit-LimitApeluri permise pe minut
X-RateLimit-RemainingApeluri rămase în minutul curent
X-RateLimit-ResetSecunde până se resetează minutul
X-Credits-CostCâte credite a costat acest apel
X-Credits-LimitCreditele perioadei
X-Credits-RemainingCredite rămase
X-Credits-ResetCând se resetează creditele (ISO 8601)
Retry-AfterCâte secunde aștepți, doar la 429 și 503

Istoricul

Dacă ceri mai multe zile decât permite planul, răspunsul este tăiat la limita planului și meta.history_cut: true îți spune asta.

Cum reiei un apel

Citește Retry-After, așteaptă cât spune și încearcă din nou. La quota_exceeded nu reîncerca: așteaptă resetarea din X-Credits-Reset.

async function call(url, key) {
  for (let attempt = 0; attempt < 3; attempt++) {
    const res = await fetch(url, { headers: { Authorization: `Bearer ${key}` } });
    const body = await res.json();
    if (res.ok) return body;
    if (body.error.code === "quota_exceeded") throw new Error(body.error.message);
    const wait = Number(res.headers.get("retry-after"));
    if (![429, 503].includes(res.status) || !wait) throw new Error(body.error.message);
    await new Promise((ok) => setTimeout(ok, wait * 1000));
  }
  throw new Error("still busy");
}
import json, time, urllib.error, urllib.request

def call(url, key):
    req = urllib.request.Request(url, headers={"Authorization": f"Bearer {key}"})
    for attempt in range(3):
        try:
            with urllib.request.urlopen(req) as res:
                return json.load(res)
        except urllib.error.HTTPError as err:
            body = json.load(err)
            wait = err.headers.get("Retry-After")
            if err.code not in (429, 503) or not wait or body["error"]["code"] == "quota_exceeded":
                raise
            time.sleep(int(wait))
    raise RuntimeError("still busy")
<?php
function call(string $url, string $key): array {
    for ($attempt = 0; $attempt < 3; $attempt++) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer $key"]]);
        $raw = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        $size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        curl_close($ch);
        $body = json_decode(substr($raw, $size), true);
        if ($status < 400) {
            return $body;
        }
        preg_match("/retry-after: (\\d+)/i", substr($raw, 0, $size), $m);
        if (!in_array($status, [429, 503]) || empty($m[1]) || $body["error"]["code"] === "quota_exceeded") {
            throw new RuntimeException($body["error"]["message"]);
        }
        sleep((int) $m[1]);
    }
    throw new RuntimeException("still busy");
}