# API i CLI muzyki

> Przekształć pomysł lub swoje teksty w piosenkę za pomocą własnych skryptów. Użyj tego samego konta, kredytów i prywatnej biblioteki co w aplikacji.

[llms.txt](https://wordsintomusic.com/pl/developers/llms.txt)

## Połącz swoje konto

[Utwórz konto](https://wordsintomusic.com/create/) i zweryfikuj swój adres e-mail.

Otwórz Ustawienia i utwórz klucz API. [Klucze API](https://wordsintomusic.com/app/settings/)

Przechowuj klucz na swoim serwerze lub w menedżerze sekretów. Wysyłaj go jako nagłówek Authorization, nigdy w adresie URL ani w kodzie frontendowym.

Klucze wygasają po 90 dniach. Możesz mieć pięć aktywnych kluczy i natychmiast odwołać dowolny klucz w Ustawieniach. Klucze tylko do odczytu nie mogą generować utworów.

```bash
curl https://mcp.wordsintomusic.com/v1/account \
  -H "Authorization: Bearer $WIM_API_KEY"
```

## Przygotuj, rozpocznij i sprawdź swój utwór

Najpierw przygotuj brief bez wydawania kredytu. Rozpoczęcie tego przygotowania zużywa jeden istniejący kredyt na utwór. Zachowaj ten sam identyfikator żądania podczas ponawiania próby. Przekroczenie czasu nie może rozpocząć kolejnego utworu.

Wyślij ten JSON do POST /v1/songs/prepare. Następnie wyślij jego preparedRequestId do POST /v1/songs/start. Sprawdzaj GET /v1/jobs/{jobId} co najmniej co 15 sekund. Gdy będzie gotowy, otwórz zwrócony prywatny link do biblioteki, aby posłuchać lub pobrać.

Obsługiwane języki utworów to angielski, hiszpański, niemiecki, francuski, portugalski brazylijski, włoski, niderlandzki, polski, szwedzki, japoński i koreański. Wybierz długość od 60 do 180 sekund. Użyj trybu tekstu piosenki dla własnego tekstu lub instrumental: true dla muzyki bez wokalu.

```json
{
  "requestId": "my-first-song-20261021",
  "input": {
    "mode": "idea",
    "idea": "Piosenka pełna nadziei o zaczynaniu od nowa w nowym mieście",
    "direction": "Ciepły akustyczny pop, stabilne bębny, delikatne wokale",
    "language": "pl",
    "duration": 120
  },
  "uiLocale": "pl"
}
```

## Punkty końcowe API

Bazowy URL API to `https://mcp.wordsintomusic.com/v1`. [Pobierz specyfikację OpenAPI](https://wordsintomusic.com/pl/openapi.json) dla pól żądań, limitów, uprawnień i formatów odpowiedzi.

| Metoda i ścieżka | Działanie |
| --- | --- |
| `GET /v1/account` | Sprawdź dostępne kredyty na utwory |
| `POST /v1/billing/checkout` | Utwórz link do płatności Stripe |
| `POST /v1/songs/prepare` | Przygotuj utwór bez wydawania kredytu |
| `POST /v1/songs/start` | Wygeneruj przygotowany utwór, używając jednego istniejącego kredytu |
| `GET /v1/jobs/{jobId}` | Sprawdź status generowania |
| `GET /v1/songs` | Wyświetl swoją prywatną bibliotekę utworów |
| `GET /v1/songs/{id}` | Przeczytaj jeden ze swoich utworów |

https://mcp.wordsintomusic.com/v1

[Pobierz specyfikację OpenAPI](https://wordsintomusic.com/openapi.json)

## API OAuth dla połączonych aplikacji

Zapier i inne połączone aplikacje używają OAuth 2.0 zamiast klucza API. Użytkownik loguje się do Words into Music i zatwierdza każde uprawnienie. Następnie aplikacja wysyła żądania JSON do jednego endpointu HTTPS.

```http
Authorization URL  GET   https://mcp.wordsintomusic.com/authorize
Token URL          POST  https://mcp.wordsintomusic.com/token
API endpoint       POST  https://mcp.wordsintomusic.com/mcp
Discovery          GET   https://mcp.wordsintomusic.com/.well-known/oauth-authorization-server
Scopes             account:read songs:read songs:create offline_access
```

Użyj przepływu kodu autoryzacji z PKCE S256. Tokeny dostępu wygasają po 15 minutach. Aby odświeżyć token, wyślij grant_type=refresh_token, token odświeżania i swój client_id na adres URL tokena. Każde odświeżenie zwraca nowy token odświeżania, ważny przez 30 dni.

Wyślij token dostępu w nagłówku Authorization: Bearer razem z Content-Type: application/json i Accept: application/json, text/event-stream. Każde żądanie to wiadomość JSON-RPC 2.0 tools/call, która wskazuje jedną operację i jej argumenty.

```http
POST https://mcp.wordsintomusic.com/mcp
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Accept: application/json, text/event-stream

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_account_usage",
    "arguments": {}
  }
}

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"accountReference\":\"WIM-3F9A1C07B2D4\",\"availableSongs\":4,\"reservedSongs\":0,\"songCreditCost\":1,\"accountUrl\":\"https://wordsintomusic.com/app/songs/\",\"supportedLanguages\":[\"en\",\"es\",\"de\",\"fr\",\"pt-BR\",\"it\",\"nl\",\"pl\",\"sv\",\"ja\",\"ko\"]}"
      }
    ],
    "structuredContent": {
      "accountReference": "WIM-3F9A1C07B2D4",
      "availableSongs": 4,
      "reservedSongs": 0,
      "songCreditCost": 1,
      "accountUrl": "https://wordsintomusic.com/app/songs/",
      "supportedLanguages": ["en", "es", "de", "fr", "pt-BR", "it", "nl", "pl", "sv", "ja", "ko"]
    }
  }
}
```

Dane znajdują się w result.structuredContent. Ich pola odpowiadają odpowiedzi REST dla tej samej akcji w specyfikacji OpenAPI. Nieudana operacja zwraca result.isError: true z kodem błędu. Brak tokena dostępu lub wygasły token zwraca HTTP 401.

```http
POST https://mcp.wordsintomusic.com/mcp
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Accept: application/json, text/event-stream

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "list_songs",
    "arguments": {
      "limit": 20
    }
  }
}

HTTP/1.1 200 OK
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"songs\":[{\"id\":\"sample-song-a1b2c3\",\"title\":\"Sample Song\",\"language\":\"en\",\"duration\":120,\"createdAt\":1792488600000,\"favorite\":false,\"url\":\"https://wordsintomusic.com/app/songs/sample-song-a1b2c3/\"}],\"cursor\":null}"
      }
    ],
    "structuredContent": {
      "songs": [
        {
          "id": "sample-song-a1b2c3",
          "title": "Sample Song",
          "language": "en",
          "duration": 120,
          "createdAt": 1792488600000,
          "favorite": false,
          "url": "https://wordsintomusic.com/app/songs/sample-song-a1b2c3/"
        }
      ],
      "cursor": null
    }
  }
}
```

list_songs zwraca do 20 utworów na żądanie, od najnowszych. Przekaż zwrócony cursor, aby odczytać następną stronę. Wartość null w polu cursor oznacza, że nie ma więcej utworów. createdAt jest podawane w milisekundach Unix. Adres url otwiera prywatną stronę utworu w bibliotece, a właściciel musi się zalogować, aby ją zobaczyć.

| Operacja | Uprawnienie | Działanie |
| --- | --- | --- |
| `get_account_usage` | `account:read` | Sprawdź dostępne kredyty na utwory |
| `list_songs` | `songs:read` | Wyświetl swoją prywatną bibliotekę utworów |
| `get_song` | `songs:read` | Przeczytaj jeden ze swoich utworów |
| `get_song_job` | `songs:read` | Sprawdź status generowania |
| `prepare_song` | `songs:create` | Przygotuj utwór bez wydawania kredytu |
| `start_song` | `songs:create` | Wygeneruj przygotowany utwór, używając jednego istniejącego kredytu |
| `create_checkout_link` | `songs:create` | Utwórz link do płatności Stripe |

Integracja z Zapierem używa dwóch operacji. Test połączenia wywołuje get_account_usage i oznacza połączenie wartością accountReference, czyli stałym kodem, który nie ujawnia adresu e-mail ani identyfikatora konta. Wyzwalacz New Song wywołuje list_songs z limit 20 i podąża za polem cursor przez maksymalnie pięć stron.

Żądania OAuth wliczają się do tego samego limitu 120 żądań na konto na minutę co klucze API. Odczyt wykorzystania konta lub biblioteki utworów nie zużywa kredytów.

## Użyj wiersza poleceń

Użyj Node.js 22 lub nowszego. Przekaż klucz do logowania przez standardowe wejście lub podaj WIM_API_KEY ze swojego menedżera sekretów. Nie umieszczaj go w argumentach poleceń ani historii powłoki. Uruchom wim --help, aby uzyskać szczegóły.

```bash
npm install -g words-into-music-cli
wim login --key-stdin
wim account
wim prepare --file brief.json
wim start PREPARED_REQUEST_ID --confirm
wim job JOB_ID
wim songs --limit 10
```

## Kredyty, limity i prywatność

Jeśli potrzebujesz kredytów na utwory, API zwróci HTTP 402. Wybierz ofertę z GET /v1/account, a następnie POST /v1/billing/checkout z potwierdzonym wyborem. Zapłać na Stripe bez kolejnego logowania do witryny. Sprawdź swoje saldo i ponów próbę z oryginalnym preparedRequestId po potwierdzeniu płatności.

Dostęp do API i CLI nie wymaga oddzielnej subskrypcji. Generowanie nagrania wykorzystuje Twój istniejący limit utworów, z tymi samymi limitami konta co aplikacja. API nigdy nie obciąża Cię automatycznie.

Można odczytywać tylko utwory właściciela klucza. Teksty są zwracane tylko na żądanie. Odwołanie klucza zatrzymuje nowe wywołania API, podczas gdy utwór już zaakceptowany kontynuuje przetwarzanie.

Brama zezwala na maksymalnie 30 żądań API na minutę na adres IP. Wywołania API i MCP również współdzielą limit 120 żądań na konto na minutę. Przestrzegaj Retry-After w odpowiedzi 429. Pomyślne identyfikatory przygotowania pozostają dostępne do ochrony przed ponownymi próbami przez 30 dni po wygaśnięciu.

W przypadku połączeń z asystentem, użyj naszego [Przewodnik konfiguracji MCP](https://wordsintomusic.com/pl/mcp/). W przypadku limitów konta, zobacz [Cennik](https://wordsintomusic.com/pl/pricing/).
