# Szybki start

Uruchom pierwsze generowanie w kilka minut. Wszystkie 1496 modeli przyjmują ten sam rodzaj żądania i zwracają
ten sam obiekt żądania dla obrazów, wideo i audio: naucz się tego raz tutaj.

> [!NOTE]
> Bazowy URL `https://api.doitong.com/v1`. Każde wywołanie wysyła `Authorization: Bearer <your key>`, a ten sam klucz działa z interfejsem HTTP
> API i serwerem MCP.

## 1. Uzyskaj klucz API

Utwórz klucz na stronie [https://doitong.com/developers/dashboard#keys](https://doitong.com/developers/dashboard#keys) i przechowuj go w zmiennej
środowiskowej: jest wyświetlany tylko raz. Każdy klucz może mieć własny budżet, więc możesz przekazać go agentowi
bez ryzyka dla całego konta. `GET /account` zwraca saldo API.

```bash
export DOITONG_API_KEY="doitong_..."

curl "https://api.doitong.com/v1/account" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```
```javascript
const res = await fetch("https://api.doitong.com/v1/account", {
  headers: { Authorization: `Bearer ${process.env.DOITONG_API_KEY}` },
});

console.log(await res.json());
```
```python
import os
import requests

r = requests.get(
    "https://api.doitong.com/v1/account",
    headers={"Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}"},
)
print(r.json())
```

Uruchomienia są opłacane z **salda API** konta w kredytach API: 1000 kredytów API = 1 $, a każdy model kosztuje
dokładnie tyle, ile ustalił jego twórca. Doładuj konto na stronie [https://doitong.com/developers/dashboard#balance](https://doitong.com/developers/dashboard#balance).

## 2. Uzyskaj wycenę, a następnie uruchom

`POST /quote/{model_id}` przyjmuje wejściowy JSON i zwraca dokładną cenę. Nie wymaga klucza i nic nie kosztuje.
Uruchomienie z tymi samymi danymi wejściowymi kosztuje dokładnie tyle: wycena jest opłatą. (Wyjątkiem jest model
rozliczany na podstawie wykorzystania: jego wycena to maksymalny koszt uruchomienia, a niewykorzystana część jest
zwracana po zakończeniu uruchomienia).

```bash
curl -X POST "https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video" \
  -H "Content-Type: application/json" \
  -d '{"image": "https://example.com/fox.jpg", "duration": 5, "generate_audio": true}'
```
```javascript
const res = await fetch("https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ image: "https://example.com/fox.jpg", duration: 5, generate_audio: true }),
});

const quote = await res.json();
console.log(quote.credits, quote.usd); // 840 "0.84"
```
```python
import requests

r = requests.post(
    "https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video",
    json={"image": "https://example.com/fox.jpg", "duration": 5, "generate_audio": True},
)
print(r.json()["credits"], r.json()["usd"])  # 840 0.84
```

```json 200 OK · wycena
{
  "object": "quote",
  "model": "kling-video/v3/pro/image-to-video",
  "credits": 840,
  "usd": "0.84",
  "unit": "second",
  "quantity": 5,
  "unit_credits": 168,
  "mode": "exact",
  "breakdown": "5 s × 168 API credits"
}
```

Następnie wyślij to samo ciało do `POST /run/{model_id}`. Dodaj `?wait=20`, aby utrzymać połączenie przez maksymalnie 20 sekund: szybki
model zwróci gotowy wynik w ramach jednego żądania i jednej odpowiedzi. Wyślij nagłówek `Idempotency-Key`, aby ponowienie
nigdy nie uruchomiło zadania ani nie naliczyło opłaty dwa razy.

```bash
curl -X POST "https://api.doitong.com/v1/run/flux/schnell?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: lighthouse-001" \
  -d '{"prompt": "A lighthouse on a rocky coast at dusk, warm light in the window"}'
```
```javascript
const res = await fetch("https://api.doitong.com/v1/run/flux/schnell?wait=20", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.DOITONG_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "lighthouse-001",
  },
  body: JSON.stringify({ prompt: "A lighthouse on a rocky coast at dusk, warm light in the window" }),
});

const request = await res.json();
console.log(request.status, request.outputs[0]?.url);
```
```python
import os
import requests

r = requests.post(
    "https://api.doitong.com/v1/run/flux/schnell",
    params={"wait": 20},
    headers={
        "Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}",
        "Idempotency-Key": "lighthouse-001",
    },
    json={"prompt": "A lighthouse on a rocky coast at dusk, warm light in the window"},
)
request = r.json()
print(request["status"], request["outputs"][0]["url"] if request["outputs"] else None)
```

Odpowiedzią jest obiekt żądania:

```json 200 OK · żądanie
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "flux/schnell",
  "status": "succeeded",
  "cost": { "credits": 3, "usd": "0.003", "charged": 3, "refunded": 0 },
  "outputs": [
    { "type": "image", "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
      "content_type": "image/jpeg", "width": 1024, "height": 768, "stored": true }
  ],
  "error": null
}
```

## 3. Śledź status

Jeśli model nadal pracuje po upływie czasu oczekiwania, otrzymasz `202 Accepted` z `id` żądania i jego bieżącym
`status`. Każde żądanie przechodzi przez ten sam cykl życia:

Cykl życia żądania: `queued` → `running` → `succeeded` | `failed` | `canceled` (final; nieudane i anulowane są zwracane).

Odczytaj żądanie ponownie, używając jego identyfikatora. `?wait=20` działa również tutaj, więc wystarczy prosta pętla:

```bash
curl "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```
```javascript
const headers = { Authorization: `Bearer ${process.env.DOITONG_API_KEY}` };
let request = await (await fetch("https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20", { headers })).json();

while (request.status === "queued" || request.status === "running") {
  const res = await fetch(`https://api.doitong.com/v1/requests/${request.id}?wait=20`, { headers });
  request = await res.json();
}

console.log(request.status, request.outputs[0]?.url);
```
```python
import os
import requests

headers = {"Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}"}
request = {"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t", "status": "queued"}

while request["status"] in ("queued", "running"):
    request = requests.get(
        f"https://api.doitong.com/v1/requests/{request['id']}",
        params={"wait": 20},
        headers=headers,
    ).json()

print(request["status"], request["outputs"][0]["url"] if request["outputs"] else None)
```

Gdy `status` ma wartość `succeeded`, `outputs[].url` zawiera linki do plików w naszej przestrzeni dyskowej. Jeśli żądanie ma status `failed` lub
`canceled`, jego kredyty API są automatycznie zwracane, a `error` informuje o przyczynie. Anuluj wszystko, co nadal ma status `queued` lub
`running`:

```bash
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

W przypadku długich zadań wideo możesz pominąć odpytywanie i zamiast tego przekazać `webhook_url` (zobacz [Webhooki](https://doitong.com/developers/docs/webhooks)).

## 4. Pliki

Przekaż dowolny publiczny URL jako dane wejściowe albo poproś `POST /files` o URL przesyłania, wykonaj `PUT` pliku pod tym adresem i użyj zwróconego
`file_url` (zobacz [Pliki](https://doitong.com/developers/docs/files)). Zakończone powodzeniem żądanie zawiera wyniki w `outputs[]` wraz z typem, typem zawartości oraz,
jeśli są znane, wymiarami i czasem trwania.

```bash
curl -X POST "https://api.doitong.com/v1/files" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename": "fox.jpg", "content_type": "image/jpeg", "size": 482113}'
```

> [!TIP]
> **Pliki przechowywane bezterminowo albo 7 dni bezpłatnie — wybór należy do Ciebie.** Pliki wynikowe są kopiowane do naszej
> przestrzeni dyskowej przed pomyślnym zakończeniem żądania. Domyślnie pozostają tam do momentu usunięcia (100 kredytów API
> za GB miesięcznie); wyłącz przełącznik „Przechowuj pliki bezterminowo” w panelu albo przekaż `?storage=temporary`, aby przechowywać je przez
> 7 dni bezpłatnie (zobacz [Pliki](https://doitong.com/developers/docs/files#storage)).

## Błędy

Każdy model zgłasza błędy w ten sam sposób: jedno opakowanie zawierające `type`, dokładny `code`, problematyczny `param` oraz każdy problem
w `details`, dzięki czemu agent może naprawić żądanie bez czytania opisu. Za nieprawidłowe żądanie nie jest naliczana opłata.

```json 422 Unprocessable Entity
{
  "error": {
    "type": "invalid_request",
    "code": "invalid_input",
    "message": "duration must be one of 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.",
    "param": "duration",
    "details": [ { "param": "duration", "message": "duration must be one of 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15." } ],
    "request_id": null,
    "doc_url": "https://doitong.com/developers/docs/errors#invalid_input"
  }
}
```

Wszystkie typy i kody wymieniono w sekcji [Błędy](https://doitong.com/developers/docs/errors).

## Cennik

Ceny są podawane w USD i kredytach API oraz wyświetlane na stronie każdego modelu przed uruchomieniem. Każde żądanie zawiera `cost` z polami
`credits`, `usd`, `charged` i `refunded`. Opłata za uruchomienie jest naliczana po jego zaakceptowaniu; żądania ze statusem `failed` i `canceled` są
automatycznie zwracane. Niektóre modele mają cenę wyliczaną dokładnie na podstawie danych wejściowych, inne na podstawie długości lub rozmiaru wysyłanych
plików, a pozostałe mają *szacowaną cenę za uruchomienie*: w każdym przypadku płacisz cenę z wyceny. Niektóre modele (modele językowe i wizyjne,
narzędzia głosowe oraz narzędzia zależne od czasu przetwarzania) są *rozliczane na podstawie wykorzystania*: wycena to maksymalny koszt uruchomienia,
a niewykorzystana część jest automatycznie zwracana. Zobacz [Cennik](https://doitong.com/developers/docs/pricing).

## MCP i agenci AI

Połącz dowolnego klienta MCP z `https://api.doitong.com/v1/mcp`, używając tego samego klucza Bearer. Agent może przeszukiwać katalog, uzyskiwać wyceny i
uruchamiać modele oraz odczytywać każdą stronę dokumentacji w formacie Markdown.

```bash Claude Code
claude mcp add --transport http doitong-models https://api.doitong.com/v1/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"
```

## Następne kroki

- Przeglądaj [wszystkie modele](https://doitong.com/developers/models). Każda strona zawiera kreator żądań, który generuje kod.
- Poznaj cykl życia żądania: [Żądania](https://doitong.com/developers/docs/requests).
- Używaj tych samych nazw parametrów dla każdego modelu: [Parametry](https://doitong.com/developers/docs/parameters).
- Pracujesz z agentem AI do programowania? Przekaż mu [https://doitong.com/developers/llms.txt](https://doitong.com/developers/llms.txt) albo połącz go z [serwerem MCP](https://doitong.com/developers/docs/mcp).
