---
title: "GET /templates — List Templates"
url: https://lumean.app/de/developers/docs/api/get-templates
locale: de
description: "List Templates"
generated: 2026-10-17
operationId: template.index
method: GET
path: /templates
scopes: [templates.read]
spec_version: 0.0.1
---

# GET /templates

**List Templates**

A paginated list of the key owner's templates: by default those **at the root** (no
folder), newest first, **30 per page at most**.

A template is a saved set of generation settings — service, voice, model, output
format. Its `id` goes into `template_id` when you create an order. There is no need to
create a template per order: reuse one and adjust it per order with `config_override`
in `POST /orders`.

Response: `data.items[]` — templates, `data.current_page` / `last_page` / `per_page` /
`total` — pagination. To walk everything request `page=1, 2, …` until
`current_page = last_page`. Find a template by name with `search`, by service with
`service`, inside a folder with `folder_id`; folders together with templates —
`GET /templates/browse`.

**Legacy mode (deprecated).** A request **without a single parameter** still returns
every root template as one array in `data` and carries the `Deprecation` and `Sunset`
(removal date) headers. After that date such a request gets the first page. To migrate,
add `?page=1` and read `data.items`.

**Required key permission:** `templates.read`.

- Benötigtes Recht: `templates.read`

## Anfrage

```bash
curl -X GET 'https://api.lumean.app/api/public/templates' \
  -H 'Accept: application/json' \
  -H 'X-API-KEY: YOUR_API_KEY'
```

## Parameter

| Feld | In | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- | --- |
| `page` | query | `integer` | — | Page number, starting at `1`. Any list parameter switches the response to a page; a request with no parameters at all is the deprecated full list (until 06.11.2026). |
| `per_page` | query | `integer` | — | Templates per page, `1..30`. Defaults to 30. |
| `sort_by` | query | `string` — `created_at` · `name` | — | Sort field. Defaults to `created_at` (newest first with `sort_order=desc`). |
| `sort_order` | query | `string` — `asc` · `desc` | — | Sort direction. Defaults to `desc`. |
| `search` | query | `string` | — | Substring of the template name. Case-insensitive. |
| `service` | query | `string` | — | Show only templates of this service. The code is a short latin string: `elevenlabs`, `heygen`, `cartesia`, `sfx`, `music`. |
| `folder_id` | query | `string` | — | Folder UUID. Omitted — root templates (`folder_id = null`). |

## Request-Body

Kein Body.

## Antworten

### 200 — Success. The payload is in `data`.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `data` | `TemplateList` | Pflicht | A page of the key owner’s templates (30 at most): `items` plus pagination meta. For a walk that includes folders use `GET /templates/browse`. |
| `data.items` | `array<Template>` | Pflicht | Records on the current page, in the list’s sort order. |
| `data.items[].id` | `string` | Pflicht | Template UUID. Put it into `template_id` when creating an order. |
| `data.items[].user_id` | `integer` | Pflicht | ID of the template owner. |
| `data.items[].slug` | `string` | Pflicht | Short public identifier used for sharing. `null` on a template that was never shared. |
| `data.items[].name` | `string` | Pflicht | Template name — for humans only; it does not affect generation. |
| `data.items[].service_key` | `string` | Pflicht | Code of the service whose schema validates `config`: `elevenlabs`, `lumimg`, and so on. |
| `data.items[].service` | `Service \| null` — nullable | Pflicht | The template’s service for reference: name and pricing, without configuration schemas. `null` means no service with that code exists any more. |
| `data.items[].config` | `object` | Pflicht | Generation settings: voice, model, speed and so on — the set of keys is defined by the service. Look up allowed values in `GET /templates/config-options?service=<code>`; anything outside the schema is rejected with `422`. Inside an order (`template` in `GET /orders/{order}`) this is the order’s own settings — the snapshot taken at creation with `config_override` applied, not the template’s current configuration (for orders created before late September 2026 — the current template configuration with `config_override`). |
| `data.items[].is_public` | `boolean` | Pflicht | Whether the template is published in the shared catalogue. |
| `data.items[].folder_id` | `string` | Pflicht | UUID of the folder holding the template, or `null` for the root. The folder tree is visible in `GET /templates/browse`. |
| `data.items[].created_at` | `string` — date-time — nullable | Pflicht | When the template was created, ISO 8601. |
| `data.items[].updated_at` | `string` — date-time — nullable | Pflicht | When the template last changed, ISO 8601. |
| `data.current_page` | `integer` | Pflicht | Current page number, starting from one. |
| `data.last_page` | `integer` | Pflicht | Number of the last page. The walk is over once `current_page` equals `last_page`. |
| `data.per_page` | `integer` | Pflicht | Page size the server applied. |
| `data.total` | `integer` | Pflicht | Total number of records matching the filter. |

**Beispiel**

```json
{
  "success": true,
  "message": "Templates retrieved",
  "data": {
    "items": [
      {
        "id": "7e2a4c1d-8b3f-4a5e-9c6d-1f2e3a4b5c6d",
        "user_id": 501,
        "slug": null,
        "name": "Narrator Voice (EN)",
        "service_key": "elevenlabs",
        "service": {
          "id": 3,
          "code": "elevenlabs",
          "name": "ElevenLabs",
          "display_name": "ElevenLabs TTS",
          "payg_access": "everyone",
          "billing_mode": "pay_as_you_go",
          "unit_asset_id": 5,
          "unit_asset": {
            "id": 5,
            "code": "tts_units",
            "kind": "unit",
            "precision": 0,
            "name": "TTS Units",
            "deleted_at": null,
            "created_at": "2026-01-10T09:00:00+00:00",
            "updated_at": "2026-01-10T09:00:00+00:00"
          },
          "required_entitlement_id": null,
          "units_per_call": null,
          "units_per_char": 1,
          "units_per_image": null,
          "units_per_second": null,
          "min_billable_chars": 1,
          "lumcoin_per_token": 10,
          "lumc_precision": 2,
          "price_lumc_minor": null,
          "unit_size": 1,
          "uses_money_first_pricing": false,
          "rate_unit": "char",
          "display_category": "voice",
          "is_premium": false,
          "display_order": 1,
          "metadata": null,
          "is_active": true,
          "created_at": "2026-01-10T09:00:00+00:00",
          "updated_at": "2026-01-10T09:00:00+00:00"
        },
        "config": {
          "tts_settings": {
            "model_id": "eleven_multilingual_v2",
            "voice_id": "21m00Tcm4TlvDq8ikWAM",
            "mode": "mode_v1",
            "language_code": null,
            "advanced_voice_settings": true,
            "voice_settings": {
              "stability": 0.5,
              "similarity_boost": 0.75,
              "use_speaker_boost": true
            }
          }
        },
        "is_public": false,
        "folder_id": null,
        "created_at": "2026-06-01T10:00:00+00:00",
        "updated_at": "2026-06-01T10:00:00+00:00"
      },
      {
        "id": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
        "user_id": 501,
        "slug": null,
        "name": "Podcast Host (RU)",
        "service_key": "elevenlabs",
        "service": {
          "id": 3,
          "code": "elevenlabs",
          "name": "ElevenLabs",
          "display_name": "ElevenLabs TTS",
          "payg_access": "everyone",
          "billing_mode": "pay_as_you_go",
          "unit_asset_id": 5,
          "unit_asset": {
            "id": 5,
            "code": "tts_units",
            "kind": "unit",
            "precision": 0,
            "name": "TTS Units",
            "deleted_at": null,
            "created_at": "2026-01-10T09:00:00+00:00",
            "updated_at": "2026-01-10T09:00:00+00:00"
          },
          "required_entitlement_id": null,
          "units_per_call": null,
          "units_per_char": 1,
          "units_per_image": null,
          "units_per_second": null,
          "min_billable_chars": 1,
          "lumcoin_per_token": 10,
          "lumc_precision": 2,
          "price_lumc_minor": null,
          "unit_size": 1,
          "uses_money_first_pricing": false,
          "rate_unit": "char",
          "display_category": "voice",
          "is_premium": false,
          "display_order": 1,
          "metadata": null,
          "is_active": true,
          "created_at": "2026-01-10T09:00:00+00:00",
          "updated_at": "2026-01-10T09:00:00+00:00"
        },
        "config": {
          "tts_settings": {
            "model_id": "eleven_multilingual_v2",
            "voice_id": "AZnzlk1XvdvUeBnXmlld",
            "mode": "mode_v1",
            "language_code": "ru",
            "advanced_voice_settings": true,
            "voice_settings": {
              "stability": 0.4,
              "similarity_boost": 0.8,
              "use_speaker_boost": true
            }
          }
        },
        "is_public": false,
        "folder_id": null,
        "created_at": "2026-06-10T08:00:00+00:00",
        "updated_at": "2026-06-10T08:00:00+00:00"
      }
    ],
    "current_page": 1,
    "last_page": 1,
    "per_page": 30,
    "total": 2
  }
}
```

### 401 — The key is missing, unknown, disabled or expired.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Always `false` in error responses. |
| `message` | `string` | Pflicht | Error text in the key's language (set through the `X-Locale` header). |
| `data` | `null` — nullable | Pflicht | Always `null` when the request is rejected before processing. |

**Beispiel**

```json
{
  "success": false,
  "message": "API key is missing. Provide it in the X-API-KEY header.",
  "data": null
}
```

### 403 — The key lacks the required permission, or the object belongs to another user.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Always `false` in error responses. |
| `message` | `string` | Pflicht | Error text in the key's language (set through the `X-Locale` header). |

**Beispiel**

```json
{
  "success": false,
  "message": "This API key does not have permission to perform this action."
}
```

### 422 — Validation error. Offending fields are listed in `errors`.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `message` | `string` | Pflicht | Errors overview. |
| `errors` | `object` | Pflicht | A detailed description of each field that failed validation. |
| `errors.*` | `array<string>` — beliebige Schlüssel | — |  |

**Beispiel**

```json
{
  "message": "string",
  "errors": {}
}
```

---

- Diese Seite im Browser: https://lumean.app/de/developers/docs/api/get-templates
- Vollständige maschinenlesbare Referenz: https://api.lumean.app/docs/llm.md
