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

# GET /orders

**List Orders**

Returns a paginated list of the key owner's orders, newest first.

**Filtering:**

- `status` — order status; an unknown value returns `422`.
- `template_id` — template UUID.
- `task_type[]` — task type, repeatable: `?task_type[]=tts&task_type[]=sfx`.

**Terminal statuses** (the order will not change again): `completed`,
`result_delivered`, `failed`, `compensated`, `cancelled`.

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

- Benötigtes Recht: `orders.read`

## Anfrage

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

## Parameter

| Feld | In | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- | --- |
| `page` | query | `integer` — ≥ 1 | — | Page number, starting at `1`. |
| `per_page` | query | `integer` — 1..100 | — | Records per page, `1..100`. Defaults to 20. |
| `status` | query | `OrderStatus` — `created` · `pending` · `in_progress` · `completed` · `result_delivered` · `failed` · `compensated` · `cancelled` · `partially_completed` | — | Return only orders in this status. An unknown value returns `422`. Terminal (the order will not change again): `completed`, `result_delivered`, `failed`, `compensated`, `cancelled`. The non-terminal `partially_completed` means some chunks failed and are waiting for your action — see `POST /orders/{order}/items/{item}/retry`. |
| `template_id` | query | `string` — uuid | — | Return only orders created from this template (UUID from `GET /templates`). |
| `task_type[]` | query | `array<string>` | — | Task type filter, **repeatable**: `?task_type[]=tts&task_type[]=sfx`. A single string (`?task_type=tts`) is accepted too. Known values: `tts`, `image`, `txt2img`, `remix`, `image_edit`, `voice_clone`, `sfx`, `music`, `voice_search`. The list grows as new services are connected, so the filter is deliberately permissive: an unknown type yields an empty list rather than `422`. |

## Request-Body

Kein Body.

## Antworten

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

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Success flag. Branch on the HTTP status code instead: any 2xx response carries `true` here, while an error comes back in a different shape that need not contain this field at all. |
| `message` | `string` | Pflicht | A human-readable note in the account language. Fine to show to a user; do not parse it — the wording changes without notice and is not an error code. |
| `data` | `OrderList` | Pflicht | A page of the key owner’s orders, newest first. The list carries no chunks (`items`) — fetch those from `GET /orders/{order}`. |
| `data.items` | `array<Order>` | Pflicht | Records on the current page, in the list’s sort order. |
| `data.items[].id` | `string` | Pflicht | Order UUID. Use it in `/orders/{order}/…` paths and when calling `POST /orders/{order}/retry`. |
| `data.items[].user_id` | `integer` | Pflicht | ID of the order owner. For orders created with an API key this is always the key owner — a key never sees someone else’s order. |
| `data.items[].name` | `string` | Pflicht | Order name: the downloaded file name and the ZIP archive name are derived from it. |
| `data.items[].template` | `Template` | — | The template the order was created from. Present only for orders that have a `template_id`; template-less orders (`sfx`/`music` created by `task_type`) omit it. Its `config` holds the settings THIS order runs with: the template configuration at the moment the order was created, with `config_override` applied on top; editing the template later does not change it. In the `GET /orders` list `config` is `null` — the full configuration comes from `GET /orders/{order}`. The template may have been deleted since: it is still shown here, but `GET /templates/{template}` returns `404` and a new order with that `template_id` returns `422`. Orders created before this API version (late September 2026) have no snapshot: their `config` is the current template configuration with `config_override` applied, and editing the template changes it. |
| `data.items[].template.id` | `string` | Pflicht | Template UUID. Put it into `template_id` when creating an order. |
| `data.items[].template.user_id` | `integer` | Pflicht | ID of the template owner. |
| `data.items[].template.slug` | `string` | Pflicht | Short public identifier used for sharing. `null` on a template that was never shared. |
| `data.items[].template.name` | `string` | Pflicht | Template name — for humans only; it does not affect generation. |
| `data.items[].template.service_key` | `string` | Pflicht | Code of the service whose schema validates `config`: `elevenlabs`, `lumimg`, and so on. |
| `data.items[].template.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[].template.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[].template.is_public` | `boolean` | Pflicht | Whether the template is published in the shared catalogue. |
| `data.items[].template.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[].template.created_at` | `string` — date-time — nullable | Pflicht | When the template was created, ISO 8601. |
| `data.items[].template.updated_at` | `string` — date-time — nullable | Pflicht | When the template last changed, ISO 8601. |
| `data.items[].template_id` | `string` | Pflicht | UUID of the template used, or `null` when the order was created without one. |
| `data.items[].task_type` | `TaskType` — `tts` · `image` · `txt2img` · `remix` · `image_edit` · `voice_clone` · `sfx` · `music` · `voice_search` | Pflicht | Task type — it determines what goes into `task_data` and what comes back in `result`. |
| `data.items[].status` | `OrderStatus` — `created` · `pending` · `in_progress` · `completed` · `result_delivered` · `failed` · `compensated` · `cancelled` · `partially_completed` | Pflicht | Current state of the order. Terminal values are `completed`, `failed`, `cancelled` and `compensated` — there is nothing to poll for after those. `partially_completed` means some chunks succeeded and some failed: the finished files are already downloadable, and the failed fragments can be requeued via `POST /orders/{order}/items/retry-failed`. |
| `data.items[].price_units` | `integer` | Pflicht | The amount locked for the order, in LMC minor units. Do not display this number as-is: the real value is `price_units / 10^precision`, where `precision` comes from the asset alongside. A display-ready value sits in the neighbouring decimal field. |
| `data.items[].price_formatted` | `number` — nullable | Pflicht | The same amount as `price_units`, expressed in whole LMC and ready to display. `null` until the cost is settled. |
| `data.items[].currency_asset` | `Asset` | Pflicht | The amount's asset is always LMC. Its `precision` is what converts minor units into the real value. |
| `data.items[].currency_asset.id` | `integer` | Pflicht | Internal identifier of the asset. |
| `data.items[].currency_asset.code` | `string` | Pflicht | Asset code: `LUMC` is the internal currency, `TOKEN` the generation tokens. |
| `data.items[].currency_asset.kind` | `AssetKind` — `money` · `unit` | Pflicht | Kind of asset: money or consumable units. It decides whether an amount counts as a payment or as quota consumption. |
| `data.items[].currency_asset.precision` | `integer` | Pflicht | Number of decimal places. **The load-bearing field:** every integer amount in this asset is divided by `10^precision` to obtain the real value. Do not assume the divisor is 100. |
| `data.items[].currency_asset.name` | `string` | Pflicht | Display name of the asset, in the account language. |
| `data.items[].currency_asset.deleted_at` | `string` — date-time — nullable | Pflicht | When the asset was retired, ISO 8601. `null` while it is in use. |
| `data.items[].currency_asset.created_at` | `string` — date-time — nullable | Pflicht | When the asset was created, ISO 8601. |
| `data.items[].currency_asset.updated_at` | `string` — date-time — nullable | Pflicht | When the asset last changed, ISO 8601. |
| `data.items[].total_tokens` | `integer` — nullable | Pflicht | The order's full cost in tokens: the original chunks plus every retry and regeneration. This is a quota unit, not money. |
| `data.items[].total_duration_ms` | `integer` — nullable | Pflicht | Total length of the produced audio in milliseconds. This is the result's duration, not the time spent generating it. |
| `data.items[].task_data` | `object` — nullable | Pflicht | The task input exactly as the server accepted it: text, references to uploaded files, resolved settings. The set of keys depends on `task_type`. |
| `data.items[].result` | `object` — nullable | Pflicht | Execution result. `files[]` holds the primary files; `service_files[]` holds auxiliary ones (subtitles `.srt`/`.vtt`/`.lrc`, alignment) for TTS orders. Paths are **absolute** and ready to pass to `POST /storage/url`. `null` while the order is unfinished, and also for a failed order: the public surface does not expose error internals. |
| `data.items[].created_at` | `string` — date-time — nullable | Pflicht | When the order was created, ISO 8601. |
| `data.items[].updated_at` | `string` — date-time — nullable | Pflicht | When the order last changed, ISO 8601. It advances on every status transition, which makes it a cheap “something happened” signal. |
| `data.items[].files_expire_at` | `string` — nullable | Pflicht | Retention of the order's files. `files_expire_at` is the deletion moment (`null` when the order has not finished yet, or the files are already gone); `files_expired` means nothing is left to download. |
| `data.items[].files_expired` | `boolean` | Pflicht | `true` means retention has elapsed and the files are already deleted: no link can be issued, and the order has to be created again. |
| `data.items[].retention` | `object` | Pflicht | Retention deadlines by file level. For a stitched order the per-fragment tracks are removed earlier than the result itself. |
| `data.items[].retention.chunks` | `object` | Pflicht | Lifetime of the per-fragment tracks — pause editing, re-stitching and per-fragment regeneration all operate on them. |
| `data.items[].retention.chunks.expires_at` | `string` | Pflicht | When the per-fragment tracks disappear, ISO 8601. Until then pause editing, re-stitching and per-fragment regeneration remain available. `null` means the order has not finished yet (the countdown has not started) or the fragments are already gone. |
| `data.items[].retention.chunks.expired` | `boolean` | Pflicht | `true` means the per-fragment tracks are gone: editing and re-stitching are rejected. The finished result may still be available — check `retention.files`. |
| `data.items[].retention.chunks.expires_early` | `boolean` | Pflicht | `true` means the fragments will disappear before the result (the order is stitched into a separate file). `false` means the fragments are the result, and both levels expire together. |
| `data.items[].retention.chunks.reason` | `string` — `chunks_purged` · `storage_expired` · `null` — nullable | Pflicht | Why the fragments are unavailable: `chunks_purged` — removed on their own schedule while the result is still there; `storage_expired` — every file of the order is gone. `null` means the fragments are available. |
| `data.items[].retention.files` | `object` | Pflicht | Lifetime of every file of the order, including the result. Mirrors the top-level `files_expire_at` / `files_expired` fields. |
| `data.items[].retention.files.expires_at` | `string` — nullable | Pflicht | When every file of the order will be deleted, ISO 8601. The same value as `files_expire_at` — the top-level field is kept for compatibility. |
| `data.items[].retention.files.expired` | `boolean` | Pflicht | Same as `files_expired`: nothing is left to download. |
| `data.items[].eta_seconds` | `integer` — nullable | Pflicht | Estimated time remaining, in seconds — present only while the order is running. `null` once it is finished, and before it starts. |
| `data.items[].eta_at` | `string` — date-time — nullable | Pflicht | Expected completion moment, ISO 8601 — the same forecast as `eta_seconds`, expressed as an absolute time. |
| `data.items[].completed_chunks` | `integer` — nullable | Pflicht | How many source chunks are already finished. Retries and regenerations are excluded — counting them would push progress past 100%. |
| `data.items[].total_chunks` | `integer` — nullable | Pflicht | How many source chunks the order has in total. Zero means the split has not happened yet. |
| `data.items[].progress_percent` | `integer` — nullable | Pflicht | Completion percentage, 0–100 — derived from `completed_chunks` and `total_chunks`, so there is no need to compute it yourself. |
| `data.items[].stitching` | `boolean` | Pflicht | `true` means the audio is being stitched and the result is not final yet. This also happens with `status = completed`: after a fragment is regenerated the final track is rebuilt, and until stitching ends `result` points to the previous track. Download the result once `stitching = false`. |
| `data.items[].paragraphs` | `array<object>` — nullable | Pflicht | Per-paragraph summary: index, fragment count, aggregate status and progress. `null` means the order uses ordinary mode — use `items[]` instead. To get paragraphs, create the order with `config_override.generation_mode = paragraph` (see that field for details). |
| `data.items[].paragraphs[].paragraph_index` | `integer` | Pflicht | Zero-based index of the paragraph. |
| `data.items[].paragraphs[].chunks_count` | `integer \| number` | Pflicht | How many chunks the paragraph was split into. |
| `data.items[].paragraphs[].completed_chunks` | `string \| integer` | Pflicht | How many of the paragraph’s chunks are already finished. |
| `data.items[].paragraphs[].status` | `string` | Pflicht | Aggregate status of the paragraph: derived from its chunks’ statuses rather than stored separately. It uses its own, shorter vocabulary: `pending`, `in_progress`, `failed`, `completed` — a chunk blocked by moderation also reads as `failed`. Only the original chunks count, so a successful retry of a failed fragment does NOT change the paragraph status: check the fragment itself in `items[]`. |
| `data.items[].paragraphs[].progress_percent` | `integer` | Pflicht | Paragraph completion percentage, 0–100. |
| `data.items[].paragraphs[].result_file` | `string` — nullable | Pflicht | The whole paragraph stitched into one audio file: an absolute path, or a structure carrying path and size. Download it via `POST /storage/url`, same as the other order files. `null` means two different things depending on `chunks_count`: with `chunks_count = 1` the paragraph has no file of its own and never will — the paragraph *is* that single fragment, so take its `result_file` from `items[]` under the same `paragraph_index`; with `chunks_count > 1` the stitch has not happened yet — a multi-chunk paragraph gets its file ONLY after stitching, never in advance. |
| `data.items[].items` | `array<OrderItem>` | — | The order’s chunks. Present in the detailed `GET /orders/{order}` response; the list endpoint `GET /orders` omits the field — use `GET /orders/{order}/items` instead. |
| `data.items[].items[].id` | `string` | Pflicht | Chunk UUID. Use it in `/orders/{order}/items/{item}/…` paths. |
| `data.items[].items[].order_id` | `string` | Pflicht | UUID of the order this chunk belongs to. |
| `data.items[].items[].item_type` | `string` | Pflicht | What the record is: `chunk` is an original fragment, `retry` a free re-run of a failed one, `regeneration` a paid redo of a finished one. Retries and regenerations are separate records sharing the same `chunk_index`: the full attempt history is kept, and the last one is what the result plays. |
| `data.items[].items[].chunk_index` | `integer` — nullable | Pflicht | Zero-based position of the fragment within the order. It defines the order in which the final file is assembled. |
| `data.items[].items[].paragraph_index` | `string` | Pflicht | The paragraph this fragment belongs to — filled in only for the original fragments of a paragraph-mode order. It is `null` both in ordinary mode and on retry or regeneration records: those carry no paragraph link of their own and inherit it from the parent fragment via `parent_item_id`. The mode is switched on by the `generation_mode` key in the order's `config_override`. |
| `data.items[].items[].parent_item_id` | `string` | Pflicht | UUID of the source chunk — present on `retry` and `regeneration` records. `null` on an original chunk. |
| `data.items[].items[].original_text_length` | `integer` | Pflicht | Length of the text the fragment was created with. It is the ceiling for `text` in `regenerate`. |
| `data.items[].items[].current_text_length` | `integer` | Pflicht | Length of the fragment’s current text: after a regeneration it differs from `original_text_length`. |
| `data.items[].items[].price_units` | `integer` | Pflicht | Cost of the fragment in **tokens** — not money. The monetary amount lives on the order itself, in its own `price_units` field (LMC there, tokens here; the names match, the units do not). |
| `data.items[].items[].consumed_units` | `integer` | Pflicht | How many tokens were actually charged for this fragment. Zero while the fragment is unfinished. |
| `data.items[].items[].remaining_locked` | `integer` | Pflicht | How many tokens are still reserved for the fragment. Drops to zero once the fragment finishes or is cancelled. |
| `data.items[].items[].status` | `string` | Pflicht | Fragment state: `pending` waits for a worker, `processing` is in flight, `completed` is done, `failed` hit a technical error, and `policy_flagged` was rejected by the content policy. The difference between the last two dictates the fix: `failed` is cured by retrying as is, whereas `policy_flagged` requires rewording — retrying the same text is rejected again. |
| `data.items[].items[].result_file` | `object \| string \| null` — nullable | Pflicht | The finished fragment’s file: an absolute path, or a structure carrying path and size. Download it via `POST /storage/url`, same as order files. `null` until the fragment is ready. |
| `data.items[].items[].duration_ms` | `integer` — nullable | Pflicht | Duration of the produced audio in milliseconds — the length of the recording, not the generation time. `null` for non-audio tasks. |
| `data.items[].items[].attempt_number` | `integer` | Pflicht | Attempt number for this fragment, starting at 1. It grows with every retry. |
| `data.items[].items[].can_retry` | `boolean` | Pflicht | Whether a free retry is allowed right now. It already accounts for status, task type and exhausted attempts, so you need not re-check the conditions. |
| `data.items[].items[].can_regenerate` | `boolean` | Pflicht | Whether a paid regeneration is allowed right now. Available for finished fragments only. |
| `data.items[].items[].created_at` | `string` — date-time — nullable | Pflicht | When the fragment was created, ISO 8601. |
| `data.items[].items[].updated_at` | `string` — date-time — nullable | Pflicht | When the fragment last changed, ISO 8601. |
| `data.items[].items[].failure_reason` | `string` — nullable | — | Machine-readable failure reason — present only on `failed` and `policy_flagged`. Everything else gets `null`. |
| `data.items[].tokens_from_quota` | `integer` — nullable | — | How many of the spent tokens were covered by the subscription quota. `null` means the quota covered nothing. |
| `data.items[].tokens_from_payg` | `integer` — nullable | — | How many tokens were paid for out of the LMC balance, beyond the quota. `null` means there was no top-up. |
| `data.items[].tokens_spent` | `integer` — nullable | — | The sum of the two fields above: how many tokens were charged for the order (quota + top-up). Orders covered by an unlimited subscription and free versions are excluded — an unlimited order has `null` here; the generated volume is `total_tokens`. Retries are excluded — they are not billed again. |
| `data.items[].queue_position` | `integer` — nullable | — | Position in the queue — only for voice-search tasks (`voice_search`), which are processed one at a time. Other task types omit the field. |
| `data.items[].queue_wait_seconds` | `integer` — nullable | — | Estimated wait in the voice-search queue, in seconds. An estimate, not a promise — recomputed on every response. |
| `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": "Orders list retrieved successfully.",
  "data": {
    "items": [
      {
        "id": "c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
        "user_id": 501,
        "template": null,
        "template_id": null,
        "task_type": "music",
        "status": "completed",
        "price_units": 6000,
        "total_tokens": 6000,
        "task_data": {
          "n_variants": 3,
          "lyrics_text": null,
          "force_instrumental": true,
          "music_length_ms": 30000,
          "model_id": "music_v2",
          "prompt": "Lo-fi hip hop, calm, rainy night, vinyl crackle"
        },
        "result": {
          "user_message": null,
          "files": [
            "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/0/result.mp3",
            "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/1/result.mp3",
            "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/2/result.mp3"
          ]
        },
        "created_at": "2026-07-17T12:10:00+00:00",
        "updated_at": "2026-07-17T12:11:20+00:00",
        "eta_seconds": null,
        "eta_at": null,
        "completed_chunks": 3,
        "total_chunks": 3,
        "progress_percent": 100,
        "items": [
          {
            "id": "d8e9f0a1-2b3c-4d4e-8f5a-6b7c8d9e0f1a",
            "order_id": "c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
            "item_type": "chunk",
            "chunk_index": 0,
            "parent_item_id": null,
            "original_text_length": 0,
            "current_text_length": 0,
            "price_units": 2000,
            "consumed_units": 2000,
            "remaining_locked": 0,
            "status": "completed",
            "result_file": "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/0/result.mp3",
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": true,
            "created_at": "2026-07-17T12:10:05+00:00",
            "updated_at": "2026-07-17T12:11:00+00:00"
          },
          {
            "id": "e9f0a1b2-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
            "order_id": "c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
            "item_type": "chunk",
            "chunk_index": 1,
            "parent_item_id": null,
            "original_text_length": 0,
            "current_text_length": 0,
            "price_units": 2000,
            "consumed_units": 2000,
            "remaining_locked": 0,
            "status": "completed",
            "result_file": "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/1/result.mp3",
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": true,
            "created_at": "2026-07-17T12:10:05+00:00",
            "updated_at": "2026-07-17T12:11:10+00:00"
          },
          {
            "id": "f0a1b2c3-4d5e-4f6a-8b7c-8d9e0f1a2b3c",
            "order_id": "c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
            "item_type": "chunk",
            "chunk_index": 2,
            "parent_item_id": null,
            "original_text_length": 0,
            "current_text_length": 0,
            "price_units": 2000,
            "consumed_units": 2000,
            "remaining_locked": 0,
            "status": "completed",
            "result_file": "storage/501/orders/c7d8e9f0-1a2b-4c3d-8e4f-5a6b7c8d9e0f/output/chunks/2/result.mp3",
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": true,
            "created_at": "2026-07-17T12:10:05+00:00",
            "updated_at": "2026-07-17T12:11:20+00:00"
          }
        ]
      },
      {
        "id": "b2c3d4e5-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
        "user_id": 501,
        "template": null,
        "template_id": null,
        "task_type": "sfx",
        "status": "in_progress",
        "price_units": 50,
        "total_tokens": 0,
        "task_data": {
          "prompt_influence": 0.3,
          "duration_seconds": 6,
          "loop": false,
          "output_format": "mp3_44100_128",
          "text": "Footsteps on gravel, then a door creaks open."
        },
        "result": null,
        "created_at": "2026-07-17T12:05:00+00:00",
        "updated_at": "2026-07-17T12:05:00+00:00",
        "eta_seconds": 45,
        "eta_at": "2026-07-17T12:05:45+00:00",
        "completed_chunks": 0,
        "total_chunks": 1,
        "progress_percent": 0,
        "items": [
          {
            "id": "a6b7c8d9-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
            "order_id": "b2c3d4e5-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
            "item_type": "chunk",
            "chunk_index": 0,
            "parent_item_id": null,
            "original_text_length": 0,
            "current_text_length": 0,
            "price_units": 50,
            "consumed_units": 0,
            "remaining_locked": 50,
            "status": "processing",
            "result_file": null,
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": false,
            "created_at": "2026-07-17T12:05:00+00:00",
            "updated_at": "2026-07-17T12:05:00+00:00"
          }
        ]
      },
      {
        "id": "9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c",
        "user_id": 501,
        "template": {
          "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": null,
            "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": null,
            "lumcoin_per_token": null,
            "lumc_precision": 2,
            "price_lumc_minor": null,
            "unit_size": 1,
            "uses_money_first_pricing": false,
            "rate_unit": null,
            "display_category": null,
            "is_premium": false,
            "display_order": 0,
            "metadata": null,
            "is_active": true,
            "created_at": "2026-01-10T09:00:00+00:00",
            "updated_at": "2026-01-10T09:00:00+00:00"
          },
          "config": null,
          "is_public": false,
          "folder_id": null,
          "created_at": "2026-06-01T10:00:00+00:00",
          "updated_at": "2026-06-01T10:00:00+00:00"
        },
        "template_id": "7e2a4c1d-8b3f-4a5e-9c6d-1f2e3a4b5c6d",
        "task_type": "tts",
        "status": "completed",
        "price_units": 420,
        "total_tokens": 420,
        "task_data": {
          "text": "Welcome to our platform! This narration greets every new listener.",
          "total_length": 420
        },
        "result": {
          "user_message": null,
          "files": [
            "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/final/result.mp3"
          ],
          "service_files": [
            "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/final/service/subtitles.srt",
            "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/final/service/subtitles.vtt",
            "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/final/service/result.json"
          ]
        },
        "created_at": "2026-07-17T12:00:00+00:00",
        "updated_at": "2026-07-17T12:02:50+00:00",
        "eta_seconds": null,
        "eta_at": null,
        "completed_chunks": 2,
        "total_chunks": 2,
        "progress_percent": 100,
        "items": [
          {
            "id": "d4e5f6a7-8b9c-4d0e-8f1a-2b3c4d5e6f7a",
            "order_id": "9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c",
            "item_type": "chunk",
            "chunk_index": 0,
            "parent_item_id": null,
            "original_text_length": 240,
            "current_text_length": 240,
            "price_units": 240,
            "consumed_units": 240,
            "remaining_locked": 0,
            "status": "completed",
            "result_file": {
              "path": "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/chunks/0/result.mp3",
              "storage": "s3",
              "name": "chunk_0.mp3",
              "size": 512340,
              "mime_type": "audio/mpeg",
              "size_formatted": "500.33 KB"
            },
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": true,
            "created_at": "2026-07-17T12:00:05+00:00",
            "updated_at": "2026-07-17T12:02:10+00:00"
          },
          {
            "id": "e5f6a7b8-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
            "order_id": "9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c",
            "item_type": "chunk",
            "chunk_index": 1,
            "parent_item_id": null,
            "original_text_length": 180,
            "current_text_length": 180,
            "price_units": 180,
            "consumed_units": 180,
            "remaining_locked": 0,
            "status": "completed",
            "result_file": {
              "path": "storage/501/orders/9f8b2c1a-4d3e-4f5a-8b9c-0d1e2f3a4b5c/output/chunks/1/result.mp3",
              "storage": "s3",
              "name": "chunk_1.mp3",
              "size": 398210,
              "mime_type": "audio/mpeg",
              "size_formatted": "388.88 KB"
            },
            "attempt_number": 1,
            "can_retry": false,
            "can_regenerate": true,
            "created_at": "2026-07-17T12:00:05+00:00",
            "updated_at": "2026-07-17T12:02:45+00:00"
          }
        ]
      }
    ],
    "current_page": 1,
    "last_page": 1,
    "per_page": 20,
    "total": 3
  }
}
```

### 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-orders
- Vollständige maschinenlesbare Referenz: https://api.lumean.app/docs/llm.md
