---
title: WECP
url: 'https://wiki.teletypegames.org/hu/engines/warp-engine/wecp'
markdown: 'https://wiki.teletypegames.org/hu/engines/warp-engine/wecp.md'
lang: hu
date: '2026-09-10'
description: 'WECP — WarpEngine Catalog Protocol: a WarpEngine API olvasó oldala, amivel a WarpEngine Client, a warpstore-motorok és az oldal beszél. JSON, camelCase kulcsok, snake_case query-paraméterek. Minden válasz hordozza a WarpEngine-Version fejlécet. Az Authorization: Bearer … mindenhol opcionális. Az /…'
taxonomy:
  tag:
    - engine
    - reference
---

# WECP

> **WECP — WarpEngine Catalog Protocol**: a [WarpEngine](https://wiki.teletypegames.org/hu/engines/warp-engine) API olvasó oldala, amivel a [WarpEngine Client](https://wiki.teletypegames.org/hu/stores/warp-engine-client), a [warpstore](https://wiki.teletypegames.org/hu/engines/warpstore)-motorok és az oldal beszél. JSON, camelCase kulcsok, snake\_case query-paraméterek. Minden válasz hordozza a `WarpEngine-Version` fejlécet. Az `Authorization: Bearer …` mindenhol opcionális. Az `/api/software`-en kívül bármelyik végpont 404-e régebbi motort jelent, amiben nincs az adott képesség.

```ts
type Timestamp = string   // ISO 8601 UTC, "2026-07-31T16:57:28.186Z"; hiányzó = "0001-01-01T00:00:00Z"
type Path = string        // szerver-relatív, "/file/…" vagy "/api/image/7"; a katalógus bázis-URL-je elé
```

# GET /api/service

0.5-től. Mi ez a szerver, és hogyan lehet bejelentkezni. Az `auth` null, ahol nincs bejelentkezés.

```ts
interface Service {
  engine: "warp_engine"
  version: string                 // motorverzió, ugyanaz, mint a WarpEngine-Version fejléc
  api: {
    version: number               // alakverzió, minden boríték `api` mezője (2)
    catalog: {
      pageSize: number            // per_page, ha az olvasó nem mondja
      maxPageSize: number         // a legtöbb, amit egy olvasó kérhet
    }
  }
  catalog: {
    gated: boolean                // kívánhat-e bármelyik itteni cím jogosultságot
  }
  auth: null | {
    schemes: ["bearer"]
    device: {                     // device authorization grant, RFC 8628
      authorizeUrl: string        // ide POST a bejelentkezés indításához
      tokenUrl: string            // ide POST a token pollozásához
      revokeUrl: string | null    // ide DELETE a kijelentkezéshez
      verificationUrl: string     // ahová a személy beírja a user code-ot
      interval: number            // másodperc két poll között
    }
  }
  admin: null | {                 // 1.0 óta; null, amíg a hoszt kikapcsolva tartja
    version: number               // az Admin API verziója (1)
    url: string                   // a bázis-címe
    openapiUrl: string            // az OpenAPI 3.1 leírása
    mcpUrl: string | null         // az MCP-végpontja, null, ha az MCP ki van kapcsolva
    schemes: ["bearer"]
  }
  shelves: Shelf[]                // 1.7 óta; üres, ahol a hoszt nem tart polcot
}

interface Shelf {
  platform: string                // kinek a címei vannak rajta
  kinds: string[]                 // milyen asset-kindokat tart
  layout: "flat" | "folders"      // címenként egy fájl, vagy címenként egy mappa (INFO.INI + FILES.LST)
  index: string                   // az indexfájl a mappájában: "INDEX.TXT"
  urls: string[]                  // ahol a hoszt kiszolgálja a mappát (ftp, http, https)
}
```

A `shelves` (1.7 óta) megmondja, hol vannak a [polcok](https://wiki.teletypegames.org/hu/engines/warp-engine): mappák azoknak a klienseknek, amelyek nem tudják olvasni ezt az API-t, és amelyeket a hoszt FTP-n vagy sima HTTP-n szolgál ki. Az engine csak megírja őket; a címek a hoszté. Egy HTTPS-t nem beszélő gép kliense ezt a végpontot nem tudja megkérdezni, ezért megtartja a saját alapértelmezett címét.

Az `admin` az [Admin API](https://wiki.teletypegames.org/hu/engines/warp-engine/admin-api)-ra mutat, amely nem része a WECP-nek: egy katalógusolvasónak semmi sem kell belőle, és ott minden admin tokent kér. A WarpEngine 1.0 semmi mást nem változtatott, amit egy olvasó lát — a boríték továbbra is `api: 2`.

# GET /api/software

A katalógus. `page` nélkül a teljes katalógus jön egy borítékban; `page`-gel egy lapja.

```ts
interface SoftwareQuery {
  page?: number                   // 1-től; hiányzik = minden
  per_page?: number               // maxPageSize a plafon
  status?: string                 // vesszővel elválasztott státuszkulcsok
  platform?: string               // egy platformnév
  category?: string               // egy kategóriakulcs
  q?: string                      // címre és névre illesztve
  owner_id?: number               // egy kiadó szoftverei
  sort?: "title" | "updated" | "newest"
}

interface Catalog {
  api: number                     // 2; 0.13 előtti motoron hiányzik (sima lista)
  page: number
  perPage: number
  total: number                   // a szűrőkre illő szoftverek, minden lapon
  totalPages: number
  nextPage: number | null         // null-ig követni
  softwares: Entry[]
}

interface Entry {
  software: Software
  releases: Release[]             // legújabb elöl
  latestRelease: Release | null   // a legújabb, amelynek verziója nem "dev-…"
  webPlayableRelease: Release | null   // a latestRelease, ha van "html" assetje
  totalDownloads: number
  access: Access                  // 0.5-től, nyitott szabályzat alatt is ott van
}

interface Software {
  id: number
  ownerId: number
  name: string                    // a cím kulcsa
  title: string
  author: string
  desc: string                    // rövid leírás
  story: string                   // hosszú leírás
  license: string
  platform: string                // slug: "c64", "tic80", "godot", …; címkék az /api/builds-ben
  status: string                  // kulcs az /api/software/vocabulary-ból
  category: string | null         // 0.12-től; kulcs az /api/software/vocabulary-ból
  highlighted: boolean
  imageUrl: Path | null           // alapértelmezett borító
  images: { url: Path, isDefault: boolean, position: number }[]
  externalLinks: { id: number, softwareId: number, label: string, url: string }[]
  platformLinks: { name: string, url: string }[]
  createdAt: Timestamp
  updatedAt: Timestamp
  deletedAt: Timestamp | null
}

interface Release {
  id: number
  softwareId: number
  version: string                 // "1.0.0", vagy "dev-1.0.0-branch" a fő ágon kívül
  assets: Asset[]                 // ebből telepít egy áruház
  cartridgePath: Path | ""        // örökölt lapos mezők, ugyanazok az útvonalak, mint a megfelelő assetek
  sourcePath: Path | ""
  htmlFolderPath: Path | ""
  docsFolderPath: Path | ""
  downloadCount: number
  createdAt: Timestamp
  updatedAt: Timestamp
  deletedAt: Timestamp | null
}

interface Asset {
  kind: "html" | "win_x86" | "win_x64" | "linux_x64" | "linux_arm64"
      | "mac_universal" | "mac_x64" | "mac_arm64" | "cartridge" | "source" | "docs"
  path: Path                      // ezt add a GET /api/download?path= -nak
}

interface Access {
  gated: boolean                  // ez a cím kívánhat jogosultságot
  entitled: boolean | null        // true: letöltheti; false: nem; null: anonim hívó
  price: { amountCents: number, currency: string } | null
  purchaseUrl: string | null
  webUrl: string | null
}
```

# GET /api/software/facets

0.13-tól. Ugyanazok a szűrők, mint az `/api/software`-en. Minden szám az, amit az érték a többi szűrő mellett mutatna.

```ts
interface Facets {
  api: number
  total: number                   // minden szűrőre illő
  statuses: Record<string, number>     // státuszkulcs → darab
  platforms: Record<string, number>    // platform → darab
  categories: Record<string, number>   // kategóriakulcs → darab; "" a kategória nélkülieknek
}
```

# GET /api/software/vocabulary

0.13-tól. A katalógus státuszai és kategóriái, megjelenítési sorrendben.

```ts
interface Vocabulary {
  api: number
  statuses: {
    key: string                   // az érték, amit egy szoftver status-a hordoz
    label: string
    position: number
    defaultVisible: boolean       // saját preferencia nélküli áruház ezt listázza
    badge: string | null          // stílusjavaslat
  }[]
  categories: {
    key: string                   // az érték, amit egy szoftver category-ja hordoz
    label: string
    position: number
    count: number                 // hány látható szoftver viseli
  }[]
}
```

# GET /api/software/highlighted

A kiemelt cím, vagy `null`.

```ts
type Highlighted = Entry | null
```

# GET /api/builds

Platformcímkék, és hogy melyik platform milyen assetfajtákat vár.

```ts
interface Builds {
  platforms: Record<string, {     // platform slug →
    label: string                 // "TIC-80", "Plus/4", "LÖVE"
    kinds: Asset["kind"][]        // mit hordozhat egy kiadás ezen a platformon
  }>
  allKinds: Asset["kind"][]
}
```

# GET /api/softwares/:name/builds

Egy cím asset-lefedettsége kiadásonként.

```ts
interface SoftwareBuilds {
  platform: string
  expected: Asset["kind"][]
  releases: Record<string, {      // verzió →
    actual: Asset["kind"][]
    missing: Asset["kind"][]
  }>
}
```

# GET /api/download?path=

A `path` (egy `Asset.path`) alatti fájl csatolmányként, naplózott letöltéssel. 302 a tárhely-URL-re, ha a tároló nem lokális — arra a hosztra ne küldd a bearer tokent. 400 üres path, 403 a hozzáférési szabályzat megtagadta, 404 nincs.

# GET /file/\*path

Ugyanazok a fájlok inline, letöltési napló nélkül: böngészőben játszható buildek, dokumentáció, borítók. 301, ha a tároló nem lokális, 403 megtagadásnál.

# POST /api/auth/device

0.5-től, az `auth.device.authorizeUrl` címen. Bejelentkezést indít. 404, ahol az `/api/service` `auth: null`-t mond.

```ts
interface DeviceRequest {
  client_name?: string            // hogyan hívják ezt az eszközt a személy fiókjában
}

interface DeviceCode {
  deviceCode: string              // ezzel pollozz
  userCode: string                // ezt mutasd meg, "WXYZ-1234"
  verificationUrl: string         // ide küldd a személyt
  interval: number                // másodperc két poll között; a leíróé fölött nyer
  expiresIn: number               // másodperc
}
```

# POST /api/auth/device/token

Az `auth.device.tokenUrl` címen. Pollozz, amíg a state el nem dől. 404 vagy 410: az engedély eltűnt, kezdd újra.

```ts
interface TokenRequest {
  device_code: string
}

interface TokenPoll {
  state: "pending" | "approved" | "denied" | "expired"
  token?: string                  // pontosan egyszer, azon a pollon, amely jóváhagyva találja
}
```

# DELETE /api/auth/token

Az `auth.device.revokeUrl` címen. Visszavonja a kérésen utazó bearer tokent. 204 visszavonva, 401 nincs token.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [WarpEngine](https://wiki.teletypegames.org/hu/engines/warp-engine.md)
- Previous: [WarpEngine Admin API](https://wiki.teletypegames.org/hu/engines/warp-engine/admin-api.md)
