{"openapi":"3.0.3","info":{"title":"horny.studo API","version":"1","description":"Prepaid API for text, video and image models. Speech, avatars and upscale are not offered. Prices are USD micro-units on a shared USDT balance. Machine-readable guide: /v1/llms.txt"},"servers":[{"url":"https://api.horny.studio/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"Authorization","description":"Key ch_live_…"}}},"paths":{"/models":{"get":{"summary":"Model catalog with prices","responses":{"200":{"description":"models"}}}},"/llms.txt":{"get":{"summary":"Guide for agents and the live catalog","responses":{"200":{"description":"text"}}}},"/estimate":{"post":{"summary":"Price a request without starting it","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"price"},"400":{"description":"unknown_model or unpriceable"}}}},"/chat/completions":{"post":{"summary":"Text completion. Non-stream JSON, or text/event-stream when stream is true.","security":[{"apiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"completion"},"400":{"description":"unknown_model or bad_messages"}}}},"/queue/{model_id}":{"post":{"summary":"Submit a generation. Returns status_url, response_url and cancel_url.","security":[{"apiKey":[]}],"parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"webhook_url","in":"query","schema":{"type":"string","format":"uri"},"description":"Public callback URL"},{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"idempotent replay"},"202":{"description":"queued"}}}},"/requests/{request_id}/status":{"get":{"summary":"Queue status","security":[{"apiKey":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"status"}}}},"/requests/{request_id}/response":{"get":{"summary":"Model output with signed media URLs. 409 until COMPLETED.","security":[{"apiKey":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"output"},"409":{"description":"request_not_ready"}}}},"/requests/{request_id}":{"get":{"summary":"Request with price and output_urls","security":[{"apiKey":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"request"}}}},"/requests/{request_id}/cancel":{"post":{"summary":"Cancel a queued request","security":[{"apiKey":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"cancelled"}}},"put":{"summary":"Cancel a queued request","security":[{"apiKey":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"cancelled"}}}},"/files":{"post":{"summary":"Upload an input file. Returns file_id.","security":[{"apiKey":[]}],"responses":{"201":{"description":"file_id"}}}},"/requests/{request_id}/output/{index}":{"get":{"summary":"Download one output. Signed exp and sig, or the owning key.","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"index","in":"path","required":true,"schema":{"type":"integer"}},{"name":"exp","in":"query","schema":{"type":"integer"}},{"name":"sig","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"bytes"},"410":{"description":"expired"}}}}}}