Skip to content

api.horny.studio

API reference

Queue, files, webhook and error codes. Calls go to https://api.horny.studio/v1. The catalog and prices are open on the API page.

Catalog and pricesapi.horny.studio/v1

Quick start

First request

Base URL: https://api.horny.studio/v1

curl
curl -X POST https://api.horny.studio/v1/queue/bytedance/seedance-2.5/text-to-video \
  -H "Authorization: Key ch_live_…" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"a quiet street at dusk, handheld","duration_seconds":8,"resolution":"1080p","generate_audio":true}'
  1. The 202 response contains request_id, status_url, response_url and cancel_url.
  2. Poll status_url every 2–5 seconds or pass webhook_url.
  3. On COMPLETED fetch the result from response_url. File links are valid for 24 hours.

For AI agents

Machine-readable sources

Reference

Methods

GET/modelsModel catalog, units and prices
POST/estimateExact request cost before launch
POST/chat/completionsText model: messages and max_tokens, a direct reply or a stream
POST/queue/{model_id}Queue a generation, 202 response with request_id
GET/requests/{id}/statusStatus: IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED
GET/requests/{id}/responseResult with signed file links
PUT/requests/{id}/cancelCancel a queued request
POST/filesUpload an input file, returns file_id
GET/requests/{id}Request card: status, quote, actual charge

Webhooks

Completion notification

Pass webhook_url in the query or body. Treat the notification as a signal to fetch the result: confirm it via response_url with your key.

http
POST https://api.horny.studio/v1/queue/bytedance/seedance-2.5/text-to-video?webhook_url=https://example.com/hooks/imhorny

// после завершения на webhook_url придёт POST
{
  "request_id": "req_9f2c…",
  "status": "COMPLETED",
  "response_url": "https://api.horny.studio/v1/requests/req_9f2c…/response"
}

Files

Input files

POST /v1/files with the bytes and a Content-Type. The response holds a file_id like chfile_…, which goes into any URL field of the input.

  • Public https links to input files are accepted as well
  • Results are not archived: a signed link lives 24 hours, then 410
  • An Idempotency-Key header protects against duplicate submits

Errors

Response codes

401unauthorizedKey missing, revoked or invalid
402insufficient_balanceThe shared USDT balance cannot cover the hold. Top up in the studio account. There is no separate wallet
402key_limit_reachedThe key's monthly limit is reached
400unknown_model · unpriceableModel not in the catalog or inputs do not allow pricing
409idempotency_conflictSame Idempotency-Key with a different body
409request_not_readyResult requested before completion
429rate_limitedKey RPM or concurrency limit exceeded
503capacity_unavailableCapacity temporarily unavailable — retry later, nothing was charged
410expiredThe signed link (24 hours) has expired