Uwierzytelnianie
Format klucza, ograniczenia poszczególnych kluczy, widoczność zadań oraz działania, które należy podjąć natychmiast po wycieku klucza.
Każde wywołanie API, które coś tworzy, odczytuje lub rozlicza, przesyła twój klucz API w nagłówku Authorization. (Jedynym wyjątkiem jest publiczny katalog modeli do oceny oferty: nie wymaga klucza).
Authorization: Bearer sk-spicy-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNatywne API (/api/v1/*) przyjmuje wyłącznie klucze Bearer — bez plików cookie i parametrów zapytania.
Endpointy zgodności dla tekstu i wideo (/v1, /v1beta) przyjmują ten sam klucz, a dodatkowo nagłówek x-api-key używany przez SDK Anthropic i nagłówek x-goog-api-key używany przez SDK Google GenAI. Dzięki temu oficjalne SDK działają po zmianie jedynie adresu bazowego — zobacz Tekst i strumieniowanie. Te dwa nagłówki nie działają w /api/v1, a żaden endpoint nie przyjmuje klucza w parametrach zapytania URL.
Klucze API i konsola to osobne mechanizmy
Klucze API przyjmują tylko /api/v1, /v1 i /v1beta. Konsola internetowa używa własnej sesji przeglądarki. Logowania do konsoli nie można więc użyć jako klucza API, a wykradziony klucz API nie umożliwia zalogowania się do konsoli. Przesłanie niewłaściwego rodzaju danych uwierzytelniających zawsze zwraca 401, nigdy błąd uprawnień.
Jak wygląda klucz
Stały prefiks sk-spicy-, po którym następuje 48 małych znaków szesnastkowych.
| Część | Przeznaczenie |
|---|---|
sk-spicy- | Stały prefiks pozwalający rozpoznać klucz w logach, repozytoriach i skanowaniu sekretów GitHub |
| Kolejne 8 znaków | Segment wyszukiwania: umożliwia szybkie znalezienie rekordu klucza. Nadal weryfikowany jest cały klucz |
| Pozostałe 40 | Reszta sekretu. Przechowujemy tylko skrót SHA-256 całego klucza z dodatkowym sekretem pepper — sami też nie możemy go odczytać |
Prefiks jest celowy: lepiej otrzymać powiadomienie ze skanera niż dowiedzieć się o wycieku, gdy ktoś inny zużyje twoje saldo.
Klucz jest pokazywany dokładnie raz
Skopiuj go lub kliknij Zapisz jako plik, zanim zamkniesz okno. Jeśli go stracisz, utwórz nowy. Nie możemy go odzyskać — i właśnie o to chodzi. Możliwość odzyskania oznaczałaby przechowywanie go jawnym tekstem.
Utwórz klucz
- Otwórz Konsola → Klucze API i kliknij Utwórz klucz.
- Nadaj mu nazwę usługi, która będzie go używać (
production backend,staging worker). Przy unieważnianiu musisz móc go rozpoznać. - Opcjonalnie otwórz Zaawansowane, aby ustawić limity wydatków, listę dozwolonych modeli, listę dozwolonych adresów IP i datę wygaśnięcia. Wszystkie te ustawienia można później zmienić.
- Skopiuj klucz lub kliknij Zapisz jako plik i potwierdź, że został zapisany. Po zamknięciu okna nie można go ponownie wyświetlić.
Tworzenie kluczy wymaga roli właściciela, administratora lub dewelopera w zespole. Klucz należy do zespołu wybranego w lewym górnym rogu konsoli: jego użycie i limity są liczone względem tego zespołu. Każdy zespół może mieć do 50 aktywnych kluczy. Zanim klucz będzie mógł wykonywać płatne operacje, konto musi też mieć zweryfikowany adres e-mail i środki na saldzie; zobacz Konfiguracja konta.
Gdzie przechowywać klucz
- Na swoim komputerze, do testów:
export SPICY_API_KEY="…"w terminalu (działa do zamknięcia okna) albo plik.envładowany przez twój kod. Dodaj.envdo.gitignoreprzed pierwszym commitem. - Na serwerze lub platformie hostingowej: użyj ustawień sekretów lub zmiennych środowiskowych i odczytuj
SPICY_API_KEYze środowiska w kodzie. - Nigdy nie wklejaj klucza do kodu źródłowego, czatu, zrzutu ekranu, zgłoszenia do wsparcia ani promptu asystenta AI.
Nigdy nie wysyłaj klucza do klienta
Wszystko, co trafia do przeglądarki lub aplikacji, można z nich odczytać
Łączenie kodu w pakiet, zaciemnianie czy dzielenie ciągu znaków między pliki — nic z tego nie stanowi ochrony. Każdy, kto ma narzędzia deweloperskie lub dekompilator, uzyskuje twój klucz, a ujawniony klucz działa do wyczerpania salda lub ustawionych limitów.
Gdy frontend potrzebuje generowania, kieruj żądania przez własny backend: przeglądarka wywołuje twój serwer, a twój serwer nasze API. Na tej warstwie możesz też egzekwować własne limity dla użytkowników.
To samo dotyczy plików aplikacji mobilnych, klientów desktopowych, publicznych notebooków, logów CI i wszystkiego, co trafi do wyniku curl -v wklejonego do zgłoszenia do wsparcia.
Własne narzędzia we własnej przeglądarce to inny przypadek. API przyjmuje wywołania z przeglądarek, więc narzędzia używane samodzielnie, takie jak rozszerzenie SillyTavern lub aplikacja roleplay, do których wklejasz własny klucz, mogą wywoływać je bezpośrednio. Powyższa zasada dotyczy umieszczania klucza w czymś, co wczytują inne osoby. Nadaj każdemu takiemu narzędziu osobny klucz z limitem dziennym, aby widzieć jego wydatki i móc niezależnie go unieważnić.
Ograniczenia poszczególnych kluczy
Ustaw je w konsoli podczas tworzenia klucza lub później. Są egzekwowane po stronie serwera.
| Ograniczenie | Co daje | Kod biznesowy po osiągnięciu ograniczenia |
|---|---|---|
| Dzienny limit wydatków | Nowe klucze nie mają limitu, dopóki go nie ustawisz. Dodaj własną kwotę, aby ograniczyć skutki błędnej konfiguracji lub wycieku. Limit odnawia się każdego dnia według UTC | 40202 |
| Budżet miesięczny | Kwota, którą klucz może wydać w bieżącym miesiącu kalendarzowym, liczonym według UTC | 40202 |
| Łączny limit wydatków | Suma, którą klucz może kiedykolwiek wydać. Przydatne dla kluczy przekazywanych partnerowi | 40202 |
| Wygaśnięcie | Klucz przestaje działać z końcem wybranego dnia według UTC | 401 |
| Lista dozwolonych adresów IP | Wywołania mogą pochodzić tylko z wymienionych adresów lub zakresów CIDR. Zalecane dla integracji serwerowych | 40302 |
| Lista dozwolonych modeli | Na przykład ograniczenie kluczy środowiska testowego do tanich modeli. Bez tego ograniczenia klucz może wywoływać także modele dodane później | 40301 |
Karta każdego klucza pokazuje jego aktualne limity, które możesz tam w dowolnym momencie zmienić.
Limity obejmują zarówno środki zablokowane na trwające zadania, jak i już wydane, dlatego klucz może osiągnąć limit, gdy zadania nadal są wykonywane. msg wskazuje osiągnięty limit. 40202, którego msg wspomina o limicie platformy, nie dotyczy twojego klucza: utworzenie kolejnego nie pomoże, więc spróbuj później.
Lista dozwolonych adresów IP jest sprawdzana względem twojego rzeczywistego publicznego adresu widocznego w naszej sieci brzegowej, a nie adresu ostatniego proxy. Twój adres wyjściowy to publiczny IP, z którego pochodzą żądania serwera: większość platform hostingowych podaje go w ustawieniach sieci, a na własnym komputerze sprawdzisz go przez curl https://ifconfig.me.
Zadania należą do klucza, który je utworzył
Zadanie jest widoczne przez API tylko dla klucza API, który je utworzył. Dla dowolnego innego klucza, nawet z tego samego zespołu:
| Operacja wykonana innym kluczem | Wynik |
|---|---|
Odczyt zadania (recordInfo), ponowienie, zniszczenie treści lub żądanie linku do pobrania | 404, tak samo jak dla zadania, które nie istnieje |
Lista zadań (GET /api/v1/jobs) lub odczyt użycia (GET /api/v1/usage) | Tylko zadania i wydatki tego klucza |
Ponowne wysłanie żądania utworzenia z tym samym Idempotency-Key | 409, bez identyfikatora pierwotnego zadania |
409 po zmianie klucza nie oznacza, że zadanie nie powstało
Jeśli przy jednym kluczu przekroczono czas oczekiwania na odpowiedź, a ty ponownie wysyłasz żądanie z innym, 409 ukrywa zadanie, które może już działać i zostać rozliczone. Nie traktuj tego jako „zadanie nie powstało” i nie wysyłaj ponownie z nowym kluczem idempotencji: zapłacisz za drugie generowanie. Ponów kluczem użytym przy pierwszej próbie albo wyszukaj zadanie w konsoli.
Dwie rzeczy nie są związane z kluczem. Webhooki zadania są dostarczane nawet po unieważnieniu klucza, który je utworzył. Ponadto każde zadanie zespołu, niezależnie od klucza, jest widoczne w Konsola → Logi, gdzie szczegóły zadania pokazują Użyty klucz.
Rotacja
- Jeden klucz na środowisko (produkcyjne / testowe / lokalne), aby można było unieważnić jeden bez wpływu na pozostałe.
- Planowana rotacja: utwórz nowy klucz i wysyłaj nim tylko nowe zadania. Zachowaj stary klucz aktywny do chwili, gdy każde utworzone nim zadanie osiągnie stan końcowy (najpóźniej w jego
deadlineAt) i odbierzesz wyniki, a następnie go unieważnij. Stosuj tę kolejność tylko wtedy, gdy stary klucz nadal jest zaufany. - Unieważnienie działa natychmiast i nie można go cofnąć. Nie ma pamięci podręcznej, na której wygaśnięcie trzeba czekać, ani możliwości ponownego włączenia klucza; trzeba utworzyć nowy.
Po wycieku
Unieważnij go natychmiast
W Konsola → Klucze API otwórz działania klucza i wybierz Unieważnij. Działa to od razu.
Nie czekaj na własne trwające zadania: od tej chwili nie można ich odczytywać przez API tym kluczem. Zadania już zaakceptowane nadal się wykonują i są rozliczane. Odbierz wyniki przez webhooki lub w Konsola → Logi. Wyciek nie jest momentem na czekanie.
Utwórz zamiennik
Utwórz nowy klucz i zaktualizuj konfigurację serwera. Nie pozostawiaj ujawnionego klucza aktywnego podczas przygotowywania jego zamiennika.
Sprawdź, do czego go użyto
Otwórz Konsola → Logi dla okresu narażenia i poszukaj zadań, których nie utworzono celowo: nieznanych modeli, nietypowej liczby wywołań lub wydatków, których nie potrafisz wyjaśnić. Szczegóły każdego zadania pokazują Użyty klucz, a Eksport CSV zawiera identyfikator klucza dla każdego zadania. Strona kluczy API pokazuje też czas ostatniego użycia każdego klucza.
Zabezpiecz nowy klucz
Ustaw odpowiednią listę dozwolonych adresów IP i limit dzienny, a także usuń pierwotne źródło ujawnienia z kodu, logów lub konfiguracji wdrożenia.
Jeśli wystąpiły nieoczekiwane wydatki, skontaktuj się z nami przez Konsola → Wsparcie, podając identyfikatory zadań lub wartości request_id.
Jak wygląda błąd
{
"code": 401,
"msg": "Credentials are invalid or expired",
"request_id": "req_01k3m8x9q2z4v7n5p6r8s0t1w2"
}Status HTTP również wynosi 401. Każdy błąd uwierzytelniania zwraca code: 401, a msg określa jego rodzaj:
Początek msg | Co się stało | Co zrobić |
|---|---|---|
Missing credentials | Nie dotarł do nas klucz | Sprawdź zapis nagłówka Authorization: Bearer … oraz czy SPICY_API_KEY jest ustawiony w procesie wysyłającym żądanie (zmienna ustawiona w jednym oknie terminala nie istnieje w innym) |
API key format is not recognized | Coś przesłano, ale nie jest to klucz SpicyAPI | Klucze zaczynają się od sk-spicy-. Sprawdź, czy nie brakuje prefiksu Bearer , czy nie pominięto lub nie dodano znaku oraz czy razem z kluczem nie skopiowano cudzysłowów lub końca wiersza |
Credentials are invalid or expired | Klucz ma prawidłowy format, ale nie istnieje, został unieważniony lub wygasł | Te przypadki są celowo nierozróżnialne, aby nikt nie mógł sprawdzać, które klucze istnieją. Sprawdź status klucza w Konsola → Klucze API lub utwórz nowy |
Logikę programu opieraj na code, nie na tekście: sformułowanie może się zmienić i zależy od języka komunikatów o błędach. Więcej o rozróżnianiu błędów w sekcji Błędy.
Gdy samo konto nie może wywoływać API (adres e-mail nie jest zweryfikowany albo konto zawieszono), zamiast tego otrzymujesz 403. Zmiana klucza nie pomoże w tym przypadku.

