{"components":{"schemas":{"BatchOptions":{"additionalProperties":false,"properties":{"device_stamping":{"default":"off","enum":["off","iphone15pro_v1","iphone16pro_v1"],"type":"string"},"output_size":{"default":"original","enum":["original","1080p","4k"],"type":"string"},"preset":{"default":"standard","enum":["standard","minimal","text_preserving"],"type":"string"},"vertical_flip":{"default":false,"type":"boolean"}},"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":"object"}},"required":["error"],"type":"object"},"JobRequest":{"properties":{"filename":{"type":"string"},"options":{"properties":{"preset":{"default":"standard","description":"Keep existing text and layout with minimal (text_preserving is the older name). Requires vertical_flip=false or omitted. Bot preferences are not inherited.","enum":["standard","minimal","text_preserving"],"type":"string"},"vertical_flip":{"default":false,"type":"boolean"}},"type":"object"},"upload_id":{"type":"string"}},"required":["upload_id","filename"],"type":"object"},"UploadRequest":{"properties":{"content_type":{"enum":["image/jpeg","image/png","image/webp","video/mp4","video/quicktime"],"type":"string"},"filename":{"maxLength":180,"type":"string"}},"required":["filename","content_type"],"type":"object"}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http"}}},"info":{"description":"Upload media, create an Unlimited Spoofer job, and poll for the result. Authentication is a server-side Bearer API key.","title":"Spoofzy API","version":"2026-11-06"},"openapi":"3.1.0","paths":{"/spoofer/account":{"get":{"operationId":"getSpooferAccount","responses":{"200":{"description":"units_remaining, active_jobs, concurrency_limit, batch_limit and expires_at"},"401":{"description":"Invalid API key"}},"summary":"Read current prepaid balance and account limits"}},"/spoofer/batches":{"post":{"operationId":"createSpooferBatch","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":128,"minLength":12,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"completion":{"properties":{"secret":{"maxLength":128,"minLength":32,"type":"string","writeOnly":true},"url":{"description":"Public HTTPS hostname on port 443","format":"uri","type":"string"}},"required":["url","secret"],"type":"object"},"filename":{"type":"string"},"options":{"$ref":"#/components/schemas/BatchOptions"},"upload_id":{"type":"string"},"variants":{"maximum":300,"minimum":1,"type":"integer"}},"required":["upload_id","filename","variants"],"type":"object"}}},"required":true},"responses":{"200":{"description":"Idempotent replay"},"202":{"description":"Whole batch durably reserved; processing starts asynchronously"},"400":{"description":"Invalid request"},"403":{"description":"Requested batch size is not enabled"},"409":{"description":"Conflicting idempotency key or unfinished upload"},"429":{"description":"Whole batch cannot be reserved; no units charged"}},"summary":"Reserve an opt-in batch from one uploaded source"}},"/spoofer/batches/{batch_id}":{"get":{"operationId":"getSpooferBatch","parameters":[{"in":"path","name":"batch_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Batch with stable output indices, counts, refunds and refreshed result URLs"},"404":{"description":"Batch not found"}},"summary":"Poll all variant results and independent completion-delivery status"}},"/spoofer/jobs":{"post":{"operationId":"createSpooferJob","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":128,"minLength":12,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobRequest"}}},"required":true},"responses":{"200":{"description":"Idempotent replay"},"202":{"description":"Job accepted"},"400":{"description":"Invalid request or conflicting processing options"},"429":{"description":"No unit or job slot available"},"503":{"description":"Preset or worker unavailable; no unit charged"}},"summary":"Create an Unlimited Spoofer job"}},"/spoofer/jobs/{job_id}":{"get":{"operationId":"getSpooferJob","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job status and a temporary URL when completed"},"404":{"description":"Job not found"}},"summary":"Poll one Spoofer job"}},"/spoofer/uploads":{"post":{"operationId":"createSpooferUpload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadRequest"}}},"required":true},"responses":{"201":{"description":"Direct PUT upload URL"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid input"},"401":{"description":"Invalid API key"}},"summary":"Create a direct upload URL"}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"https://api.spoofzy.com/api/v1"}]}
