Analiza Video Head Swap od SpicyAPI to pierwsze z dwóch wywołań. Śledzi każdą głowę w klipie 5–30 sekund w 480p lub 720p i zwraca po jednej numerowanej miniaturze na głowę, której używa potem wywołanie podmiany. Nie zmienia wideo.
Przykłady korzystają z publicznych definicji parametrów wybranego endpointu. Podmień klucz API i przykładowe media, a potem wyślij żądanie ze swojego serwera.
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "spicyapi/head-swap-video-v1/video-analyze",
"input": {
"resolution": "720p",
"video_url": "https://example.com/reference.mp4"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
Wygenerowane ze schematu wejścia tego modelu – tego samego, względem którego API waliduje każde żądanie.
Parametry wejściowe
Te pola umieść w obiekcie input w ciele żądania. Nazwy i typy odpowiadają API. Gdy wartości domyślnej nie podano, nie zakładaj żadnej.
video_urlstringWymagane
Ujęcie do analizy, od 5 do 30 sekund. Zachowaj dokładnie ten adres: wywołanie podmiany musi działać na tym samym wideo i przepisuje go stąd automatycznie, jeśli tam go pominiesz. Musi to być bezpośredni odnośnik do samego pliku wideo — strona odtwarzająca film przekazuje nam tylko HTML, kontrola wejścia nie odczyta z niej długości, a wywołanie kończy się błędem ze zwrotem opłaty. Najpewniej jest wysłać plik bezpośrednio.
Rozdzielczość śledzenia. Wywołanie podmiany musi użyć tej samej wartości, więc wybierz rozdzielczość, którą ma mieć gotowe ujęcie. Ceny tego wywołania nie zmienia.
Domyślnie
"720p"
Dozwolone wartości
"480p""720p"
{
"additionalProperties": false,
"properties": {
"resolution": {
"default": "720p",
"description": "Tracking resolution. The swap call must run at the same value, so pick the resolution you want the finished clip to have. It does not change what this call costs.",
"enum": [
"480p",
"720p"
],
"type": "string",
"x-ui": {
"enum_labels": {
"480p": "480p",
"720p": "720p"
},
"order": 80,
"widget": "radio"
}
},
"video_url": {
"contentMediaType": [
"video/mp4",
"video/webm",
"video/quicktime"
],
"description": "Source video, 5 to 30 seconds long. Upload an MP4 or pass a public MP4 URL. The swap call has to run on this same video, so keep the URL you used here.",
"minLength": 1,
"type": "string",
"x-ui": {
"accept": [
"video/mp4"
],
"max_size_mb": 90,
"order": 100,
"primary": true,
"widget": "upload"
}
}
},
"required": [
"video_url"
],
"type": "object",
"x-pricing": {
"billingMode": "per_unit",
"variantFields": []
}
}
Śledź zadanie
HTTP 202 oznacza, że zadanie zostało przyjęte, a nie ukończone. Zapisz zwrócone taskId i odpytuj właśnie to zadanie. Nie twórz kolejnego zadania, czekając na jego wynik.
Zacznij odpytywać mniej więcej co 2 sekundy i stopniowo wydłużaj odstęp. Zatrzymaj się na stanie końcowym. Po zerwaniu połączenia odpytaj pierwotne taskId. Tworzenie ponawiaj wyłącznie z pierwotnym kluczem idempotentności i pierwotnym ciałem żądania.
Podaj callBackUrl przy tworzeniu zadania, a gotowy rekord przyjdzie do ciebie metodą POST – bez żadnej pętli odpytywania. Każda dostawa niesie X-Webhook-Timestamp, X-Webhook-Signature i X-Webhook-Payload-Version. Podpis to HMAC-SHA256 w base64 z taskId.timestamp.sha256(body), więc trzeba go sprawdzać na surowych bajtach: sparsowanie JSON-a i ponowne zserializowanie zmienia je i weryfikacja się nie powiedzie. Nieudane dostawy są ponawiane, więc to samo taskId może przyjść dwa razy – zrób obsługę idempotentną. Najpierw odpowiedz kodem 2xx, a pracę wykonaj potem; wolna obsługa jest traktowana jak nieudana dostawa.
Odczytaj wynik
Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.
Każdy dostępny materiał otwieraj lub pobieraj bezpośrednio spod assets[].url, bez nagłówka Authorization. Podpisany adres wygasa o expiresAt; odpytaj zadanie ponownie, żeby go odświeżyć, dopóki materiał mieści się w okresie przechowywania. Materiał oczekujący lub niedostępny nie ma adresu. Podpisane adresy traktuj jako prywatne.
SDK i integracje
Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.
Nie musisz pisać żadnego z powyższych fragmentów kodu. Wystarczy raz podłączyć serwer MCP, a każdy agent obsługujący MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — może uruchomić ten model po nazwie. Można go też wywołać z powłoki jednym poleceniem.
Powiedz to swojemu agentowi
Użyj spicyapi/head-swap-video-v1/video-analyze, żeby zrobić pięciosekundowe ujęcie dachu w neonach o zmierzchu, z powolnym najazdem, i zapisz je do ./out/.
Agent znajduje model w aktualnym katalogu, sam wysyła plik lokalny, a potem pokazuje dokładną wycenę wraz z maksymalną opłatą i czeka na twoje potwierdzenie. Nic nie zostaje naliczone, dopóki nie zgodzisz się wprost.
Pierwsza linia daje agentowi narzędzia; druga daje mu Skill, czyli reguły ich używania: najpierw wycena, potem opłata, wysyłanie plików lokalnych zamiast wklejania bajtów i odczyt gotowego adresu materiału zamiast zgadywania. Każdy inny klient podłącza ten sam serwer przez własny plik konfiguracyjny – zobacz centrum dla deweloperów.
Wejściem jest własny schemat tego endpointu, ten sam co w przykładach powyżej. --wait odpytuje aż do zakończenia zadania i wypisuje wynik; dodaj --yes, żeby pominąć pytanie o potwierdzenie w CI. Najpierw ustaw SPICY_API_KEY – jeden klucz działa w API, w CLI i na serwerze MCP.
Ciało żądania przyjmuje adresy, a nie bajty. Najpierw wyślij plik i podaj wypisany identyfikator spicy:// – nazwa pola powyżej pochodzi wprost ze schematu tego endpointu. Agent na MCP robi ten krok za ciebie, dlatego zdanie wyżej może wskazać ./poster.png bezpośrednio. Media dostępne już publicznie po HTTPS nie wymagają wysyłania.
Jak długo przechowujemy wyniki
npx @spicyapi/cli tasks create --model spicyapi/head-swap-video-v1/video-analyze \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied
--retention potrafi wyłącznie skrócić okno – 30m, 1h, 7d albo 0, żeby usunąć zaraz po osiągnięciu przez zadanie stanu końcowego. Obowiązuje najkrótsza z trzech wartości: twojego żądania, ustawień konta i maksimum platformy, więc odczytaj ją z rekordu zadania, zamiast zakładać, że podana liczba zadziałała. Podanie okna dłuższego, niż pozwala konto, nic nie zmienia.
Użyj w ComfyUI
Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Video Head Swap · Video Analysis. Węzeł ma te same opcje co ta strona i pokazuje cenę, zanim ruszy.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Osadzony panel czyta ten sam schemat co ta strona, więc nie może się od API rozjechać. Jeśli twoja dokumentacja potrzebuje treści przeszukiwalnej, pobierz JSON spod /api/embed/models/ i wyrenderuj go samodzielnie.