# Scail 2 API

> Κινεί μια εικόνα χαρακτήρα-αναφοράς με κίνηση από βίντεο οδήγησης ή την αντικαθιστά στην αρχική σκηνή

Λαμβάνει ένα `image_url` χαρακτήρα-αναφοράς και ένα `video_url` οδήγησης που δείχνει άνθρωπο, πολλούς ανθρώπους ή ζώο. Στη λειτουργία `animation` ο χαρακτήρας εκτελεί την κίνηση οδήγησης, ενώ στη λειτουργία `replacement` αντικαθιστά το θέμα διατηρώντας τη σκηνή. Η ανάλυση είναι 512p ή 704p, με τον προσανατολισμό να επιλέγεται από την εικόνα. Το `driving_type` μπορεί να χρησιμοποιεί άμεση οδήγηση end-to-end ή ρητό σκελετό πόζας.

- Model id: `scail-2`
- Made by: Open model
- Category: Video to Video
- Output: video
- Price per second of your input video: $0.20 / second of input video (cheapest run $0.20 (200 API credits))
- Run: `POST https://api.doitong.com/v1/run/scail-2`
- Quote: `POST https://api.doitong.com/v1/quote/scail-2`
- Docs page: https://doitong.com/el/developers/models/scail-2

## Pricing

Price: **$0.20 / second of input video**. Price per second of your input video: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

The full example input below costs $2.00 = 2000 API credits (10 s input video × $0.20).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/scail-2` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  |  | Prompt που καθορίζει το επιθυμητό βίντεο εξόδου. |
| `image_url` | `image` | string (image URL) | yes |  |  | URL εικόνας αναφοράς χαρακτήρα που παρέχει τον χαρακτήρα προς κίνηση ή αντικατάσταση, με το βίντεο οδήγησης να καθορίζει την κίνηση ή την αντικατάσταση. |
| `video_url` | `video` | string (video URL) | yes |  |  | Παρέχετε βίντεο οδήγησης κίνησης μέσω URL, με έναν άνθρωπο, πολλούς ανθρώπους ή ένα ζώο. |
| `mode` |  | enum (string) | no | `animation` | `animation`, `replacement` | Επιλέξτε πώς θα χρησιμοποιηθεί ο χαρακτήρας αναφοράς: `replacement` διατηρεί την αρχική σκηνή αλλά αντικαθιστά τον χαρακτήρα με το αντικείμενο οδήγησης· `animation` εφαρμόζει την κίνηση οδήγησης στον χαρακτήρα. |
| `driving_type` |  | enum (string) | no | `end_to_end` | `end_to_end`, `pose` | Η κίνηση animation προέρχεται απευθείας από βίντεο οδήγησης που έχει καλυφθεί από το SAM3 με `end_to_end`, την προεπιλεγμένη και συνιστώμενη επιλογή για μέγιστη ανθεκτικότητα. Εναλλακτικά, το `pose` χρησιμοποιεί NLF/DWPose για απόδοση ρητού σκελετού από αυτό το βίντεο, προσφέροντας μεγαλύτερο έλεγχο σε απαιτητικές εισόδους. |
| `subject_type` |  | enum (string) | no | `human` | `human`, `animal` | Επιλογή αντικειμένου του βίντεο οδήγησης, με το `animal` να ρυθμίζει το prompt ανίχνευσης του SAM3 για αντικείμενα που δεν είναι `human`. |
| `resolution` |  | enum (string) | no | `512p` | `512p`, `704p` | Ανάλυση εξόδου με αυτόματο καθορισμό προσανατολισμού βάσει της αναλογίας διαστάσεων της εικόνας αναφοράς. Σε οριζόντιο προσανατολισμό, το 512p αντιστοιχεί σε 896x512 και το 704p σε 1280x704· σε κατακόρυφο χρησιμοποιούνται αντίστοιχα 512x896 και 704x1280. |
| `num_inference_steps` |  | integer | no | `40` | 2 – 50 | Αριθμός βημάτων δειγματοληψίας διάχυσης. Η αύξησή του βελτιώνει την ποιότητα αλλά απαιτεί περισσότερο χρόνο. |
| `guidance_scale` |  | number | no | `5` | 1 – 10 | Ισχύς classifier-free guidance, που εξισορροπεί την προσήλωση στο prompt με τη δημιουργικότητα. |
| `shift` |  | number | no | `3` | 1 – 10 | Μετατόπιση χρονοδιαγράμματος θορύβου για flow matching, με συνιστώμενη ρύθμιση 3.0 κατά τη χρήση 512p. |
| `seed` |  | integer \| null | no |  |  | Seed παραγωγής που περιλαμβάνεται στην απόκριση, είτε παρέχεται ρητά είτε επιλέγεται τυχαία επειδή η είσοδος έμεινε κενή. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Ο έλεγχος μπορεί να χαλαρώσει με τη ρύθμιση false, εφόσον ο καλών είναι εξουσιοδοτημένος. |

File parameters (`image`, `video`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "image": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
  "video": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
  "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
  "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/scail-2?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/scail-2?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/scail-2", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "scail-2",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
        "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
        "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "scail-2",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 2000,
    "usd": "2.00",
    "charged": 2000,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
    "image_url": "https://content.doitong.com/images/showcase/v3/gen_fox_cartoon.jpg",
    "video_url": "https://content.doitong.com/video/showcase/v3/gen_fox_cartoon.mp4"
  },
  "output": {
    "video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    },
    "seed": 42,
    "preprocessing_video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    },
    "preprocessing_mask_video": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_name": "0-output.mp4",
      "file_size": 1843200
    }
  },
  "outputs": [
    {
      "type": "video",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp4",
      "content_type": "video/mp4",
      "file_size": 1843200,
      "width": 1280,
      "height": 720,
      "duration": 5,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `video` | object {url, content_type, file_name, file_size} | Αρχείο βίντεο που παράγεται από την παραγωγή. |
| `seed` | integer | Seed που χρησιμοποιείται για παραγωγή βίντεο. |
| `preprocessing_video` | object {url, content_type, file_name, file_size} \| null | Βίντεο εντοπισμού σφαλμάτων που περιέχει την είσοδο conditioning στάσης Stage-A που παρέχεται στο μοντέλο διάχυσης, διαθέσιμο μόνο με `output_preprocessing=true`. Το περιεχόμενό του εξαρτάται από το `driving_type`: το `end_to_end` χρησιμοποιεί υλικό οδήγησης καλυμμένο από το SAM3, ενώ το `driving_type=pose` χρησιμοποιεί σκελετό που αποδίδεται από το NLF/DWPose. |
| `preprocessing_mask_video` | object {url, content_type, file_name, file_size} \| null | Βίντεο μάσκας οδήγησης Stage-A για εντοπισμό σφαλμάτων, διαθέσιμο μόνο με `output_preprocessing=true`. |

## Related models

- [AMT Interpolation](https://doitong.com/developers/models/amt-interpolation.md) (`amt-interpolation`): $0.000575 / second of processing time
- [AnimateDiff Turbo · Video to Video](https://doitong.com/developers/models/fast-animatediff/turbo/video-to-video.md) (`fast-animatediff/turbo/video-to-video`): $0.00125 / second of processing time
- [AnimateDiff · Video to Video](https://doitong.com/developers/models/fast-animatediff/video-to-video.md) (`fast-animatediff/video-to-video`): $0.00125 / second of processing time
- [Bernini-R Edit Video](https://doitong.com/developers/models/bernini-r/edit-video.md) (`bernini-r/edit-video`): from $0.04 / second of output video
- [Bernini-R Reference Edit Video](https://doitong.com/developers/models/bernini-r/reference-edit-video.md) (`bernini-r/reference-edit-video`): from $0.04 / second of output video
- [DWPose Pose Prediction · Video](https://doitong.com/developers/models/dwpose/video.md) (`dwpose/video`): $0.0006 / second of processing time
- [Editto](https://doitong.com/developers/models/editto.md) (`editto`): from $0.04 / second of output video
- [ID-V2V](https://doitong.com/developers/models/id-v2v.md) (`id-v2v`): $0.20 / second of output video

## Links

- HTML page: https://doitong.com/developers/models/scail-2
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=scail-2
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/scail-2
