spicyapiDokumentacja
Budowanie z API
Treść główna

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-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Natywne 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ówSegment wyszukiwania: umożliwia szybkie znalezienie rekordu klucza. Nadal weryfikowany jest cały klucz
Pozostałe 40Reszta 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

  1. Otwórz Konsola → Klucze API i kliknij Utwórz klucz.
  2. Nadaj mu nazwę usługi, która będzie go używać (production backend, staging worker). Przy unieważnianiu musisz móc go rozpoznać.
  3. 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ć.
  4. 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 .env do .gitignore przed pierwszym commitem.
  • Na serwerze lub platformie hostingowej: użyj ustawień sekretów lub zmiennych środowiskowych i odczytuj SPICY_API_KEY ze ś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.

OgraniczenieCo dajeKod biznesowy po osiągnięciu ograniczenia
Dzienny limit wydatkówNowe 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 UTC40202
Budżet miesięcznyKwota, którą klucz może wydać w bieżącym miesiącu kalendarzowym, liczonym według UTC40202
Łączny limit wydatkówSuma, którą klucz może kiedykolwiek wydać. Przydatne dla kluczy przekazywanych partnerowi40202
WygaśnięcieKlucz przestaje działać z końcem wybranego dnia według UTC401
Lista dozwolonych adresów IPWywołania mogą pochodzić tylko z wymienionych adresów lub zakresów CIDR. Zalecane dla integracji serwerowych40302
Lista dozwolonych modeliNa przykład ograniczenie kluczy środowiska testowego do tanich modeli. Bez tego ograniczenia klucz może wywoływać także modele dodane później40301

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 kluczemWynik
Odczyt zadania (recordInfo), ponowienie, zniszczenie treści lub żądanie linku do pobrania404, 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-Key409, 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 msgCo się stałoCo zrobić
Missing credentialsNie dotarł do nas kluczSprawdź 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 recognizedCoś przesłano, ale nie jest to klucz SpicyAPIKlucze 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 expiredKlucz 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.

Na tej stronie