Idempotencja Seedance i odzyskiwanie zgłoszeń
Idempotencja Seedance i odzyskiwanie zgłoszeń — Idempotency-Key, HTTP 409, acceptance_unknown.
Idempotencja Seedance i odzyskiwanie zgłoszeń
Dodaj Idempotency-Key dla seedance-2.0, seedance-2.0-fast, seedance-2.0-mini, seedance-2.5. POST /v1/videos, POST /v1/videos/generations, POST /v1/video/generations mają wspólną przestrzeń kluczy. Obrazy, wyceny, remix i inne modele wideo nie są objęte. Bez klucza nie ma ogólnej gwarancji deduplikacji.
Zakres i klucze
Klucz dotyczy konta APIMaster i operacji tworzenia wideo Seedance, nie pojedynczego API Key ani modelu. Dla każdej nowej generacji użyj nowego losowego klucza z 8–128 widocznych znaków ASCII. Ważne poświadczenia tego samego konta mogą odczytać potwierdzenie. Tokeny z wyczerpanym limitem mogą odczytywać lub powtarzać istniejące potwierdzenia; wygasłe, odwołane, usunięte klucze i zablokowane konta nie. Nowa generacja wymaga ważnych poświadczeń i wystarczającego limitu.
Atomowe powtórzenia i konflikty
Przed wyborem trasy, rozliczeniem i kontaktem z dostawcą zapisujemy atomowy rekord w bazie. Ten sam klucz i treść zwracają HTTP 202, pierwotny rekord i wstępnie przydzielony ID zadania bez nowego wysłania lub rezerwacji, także przy równoległych powtórzeniach i restartach. Zmieniona treść daje HTTP 409 (idempotency_conflict). Ignorujemy kolejność pól obiektu JSON i odstępy; porównujemy kolejność tablic, liczby, pominięte i jawne wartości domyślne, model, powiadomienia oraz grupę/kanał. multipart porównuje bajty i kolejność plików, nie granice ani nazwy. Zachowaj treść i trasę; JSON i multipart są różne. Rekordy przechowujemy co najmniej 30 dni; ta wersja nie usuwa ich automatycznie ani nie używa kluczy ponownie.
Odpowiedzi
Pierwsze żądanie zachowuje zwykłą odpowiedź tworzenia. Zapisz X-Video-Submission-Id, ID żądania i zadania. Powtórzenie zwraca potwierdzenie, niekoniecznie pierwotny format. Wstępny ID nie dowodzi przyjęcia przez dostawcę. accepted nie oznacza ukończenia generacji. Odpytuj zadanie tylko przy task_ready=true; inaczej skontaktuj się ze wsparciem bez ponownego wysyłania.
Stany zgłoszenia
pending: zapisane w bramie, jeszcze niewysłane. submitting: wysyłanie rozpoczęte, wynik oczekiwany. accepted: otrzymano ID dostawcy. not_accepted: nie wysłano do dostawcy; popraw błąd i utwórz z nowym kluczem. acceptance_unknown: możliwe przyjęcie bez potwierdzenia; nie generuj ponownie. Po awarii niedokończone rekordy są klasyfikowane przy odczycie po 30 minutach: przed wysłaniem not_accepted, po wysłaniu acceptance_unknown. Bez automatycznego ponownego wysyłania. Są to stany zgłoszenia, nie rozliczenia; rezerwacje, rozliczenia i uzgadnianie zwrotów nadal obowiązują.
Odzyskiwanie
Po timeout lub 5xx odczytaj ten sam klucz nawet bez ID zadania. Identyczne powtórzenie jest bezpieczne, ale nie uruchamia ponownie nieudanego wysłania. 404, pusta lista i brak opłat nie dowodzą nieprzyjęcia: pierwotne żądanie może być w drodze, bez klucza lub sprzed tej funkcji. same_key_replay_safe dotyczy odczytu potwierdzenia; new_submission_safe=true tylko dla not_accepted. Przy niepewnym wyniku albo accepted i task_ready=false podaj wsparciu ID potwierdzenia/żądania, model i czas UTC, nigdy API Key. Nie gwarantujemy idempotencji oficjalnego dostawcy. Stare potwierdzenia portretów zachowują dawną ścieżkę i mogą zwracać poprzedni schemat.
Przykłady
curl --fail-with-body 'https://apimaster.ai/v1/videos' \
-H "Authorization: Bearer $APIMASTER_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: seedance-order-20261014-001' \
-d '{"model":"seedance-2.0","prompt":"A paper boat on a pond","duration":4,"resolution":"480p","generate_audio":false}'
curl --fail-with-body 'https://apimaster.ai/v1/video-submissions/by-key' \
-H "Authorization: Bearer $APIMASTER_KEY" \
-H 'Idempotency-Key: seedance-order-20261014-001'
{
"code": 200,
"data": {
"submission_id": "HASH",
"task_id": "task_PUBLIC_ID",
"request_id": "ORIGINAL_REQUEST_ID",
"model": "seedance-2.0",
"status": "accepted",
"task_ready": true,
"created_at": 1791936000,
"updated_at": 1791936001,
"next_action": "query_task",
"same_key_replay_safe": true,
"new_submission_safe": false,
"retention": "at_least_30_days_no_automatic_key_reuse"
}
}
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID' \
-H "Authorization: Bearer $APIMASTER_KEY"
curl --fail-with-body 'https://apimaster.ai/v1/videos/task_PUBLIC_ID/billing' \
-H "Authorization: Bearer $APIMASTER_KEY"
