{"openapi":"3.1.0","info":{"title":"DuckDuckGoose Video Deepfake Analysis","description":"\nAnalyses one frame per second of an uploaded video with the DuckDuckGoose\nselfie deepfake detector and returns a per-second timeline of scores.\n\n**Authentication** — every request needs your DuckDuckGoose API key:\n\n    Authorization: Token <your_api_key>\n\n**Flow** — `POST /videos` (multipart upload) returns a `video_id`; poll\n`GET /videos/{video_id}` every few seconds until `status` is `completed`\n(a 60-second video typically finishes in under a minute).\n\n**Limits** — formats: mp4, webm, avi, mov, mkv · max size 5 GB · the first\n15 minutes are analysed at one frame per second.\n","contact":{"name":"DuckDuckGoose","email":"mohamed@duckduckgoose.nl"},"version":"1.0"},"paths":{"/videos":{"post":{"summary":"Upload a video for analysis","description":"Multipart upload (field name `file`). Returns a `video_id` to poll. Errors: 401 bad/missing token, 413 over 5 GB, 415 unsupported extension, 429 too many requests, 507 server storage full (retry later).","operationId":"upload_video_videos_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_video_videos_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/videos/{video_id}":{"get":{"summary":"Get analysis status and results","description":"Job `status`: `queued → analyzing → completed` (or `failed` — see `error`; or `interrupted` — re-upload). Each frame entry: `second` (timestamp in the video), `output` (`accept | inspect | reject`), `perc_fake` (0–100), `num_faces`. Frames with no visible face come back `status: \"failed\"` — treat as no signal, not as an error.","operationId":"get_video_videos__video_id__get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_upload_video_videos_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_video_videos_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}