> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rxscale.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Produkte

> Produkte eines Shops über die Public API auflisten

# Produkte

Rufen Sie eine paginierte Liste der in einem bestimmten Shop verfügbaren Produkte ab, gefiltert nach Markt.

## Produkte auflisten

```bash theme={null}
GET /v2/public-api/products/{shop_identifier}
```

<ParamField path="shop_identifier" type="string" required>
  Eindeutiger Bezeichner für den Shop
</ParamField>

<ParamField query="market" type="string" required>
  Marktbezeichner (z. B. `DE` für Deutschland)
</ParamField>

<ParamField query="search" type="string">
  Produkte und SKUs nach Name filtern
</ParamField>

<ParamField query="page" type="integer" default="0">
  Seitennummer (0-basiert)
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Ergebnisse pro Seite (max. 150)
</ParamField>

**Erforderliche Berechtigung:** `product:read`

### Beispielanfrage

```bash theme={null}
curl -X GET "https://api.rxscale.com/v2/public-api/products/my-shop?market=DE&page=0&limit=25" \
  -H "X-API-Key: your-api-key-here"
```

### Antwort

```json theme={null}
{
  "data": [
    {
      "uid": "prod-abc123",
      "display_name": "Medication X",
      "attributes": {
        "category": "Pain Relief"
      },
      "skus": [
        {
          "uid": "sku-456",
          "display_name": "Medication X 100mg",
          "attributes": {
            "package_size": "100mg"
          },
          "availability": "High",
          "telemedicine_provider_data": {
            "external_id": "partner-sku-456"
          },
          "price": 1299,
          "currency": "EUR",
          "unit": "g",
          "standard_selling_unit": 10
        },
        {
          "uid": "sku-789",
          "display_name": "Medication X 200mg",
          "attributes": {
            "package_size": "200mg"
          },
          "availability": "Medium",
          "telemedicine_provider_data": {
            "external_id": "partner-sku-789"
          },
          "price": 1999,
          "currency": "EUR",
          "unit": "g",
          "standard_selling_unit": 20
        }
      ]
    }
  ],
  "totalRegistries": 42,
  "totalPages": 2
}
```

### Antwortfelder

| Feld                                                   | Typ     | Beschreibung                                                     |
| ------------------------------------------------------ | ------- | ---------------------------------------------------------------- |
| `data`                                                 | array   | Liste der Produktobjekte                                         |
| `data[].uid`                                           | string  | Produkt-UID                                                      |
| `data[].display_name`                                  | string  | Anzeigename des Produkts                                         |
| `data[].attributes`                                    | object  | Produktattribute als Schlüssel-Wert-Paare                        |
| `data[].skus`                                          | array   | Verfügbare SKUs für dieses Produkt im angegebenen Markt          |
| `data[].skus[].uid`                                    | string  | SKU-UID (verwenden Sie diese beim Erstellen von Checkouts)       |
| `data[].skus[].display_name`                           | string  | Anzeigename der SKU                                              |
| `data[].skus[].attributes`                             | object  | SKU-Attribute als Schlüssel-Wert-Paare                           |
| `data[].skus[].availability`                           | string  | Verfügbarkeitsstufe (`High`, `Medium`, `Low` oder `Unavailable`) |
| `data[].skus[].telemedicine_provider_data.external_id` | string  | Externe SKU-ID des Telemedizin-Anbieters                         |
| `data[].skus[].price`                                  | integer | Preis in Euro-Cent                                               |
| `data[].skus[].currency`                               | string  | Preiswährung                                                     |
| `data[].skus[].unit`                                   | string  | SKU-Einheit                                                      |
| `data[].skus[].standard_selling_unit`                  | number  | Standard-Verkaufseinheit                                         |
| `totalRegistries`                                      | integer | Gesamtanzahl der übereinstimmenden Produkte                      |
| `totalPages`                                           | integer | Gesamtanzahl der Seiten                                          |

### Fehlerantworten

| Statuscode | Beschreibung                        |
| ---------- | ----------------------------------- |
| `400`      | Fehlender `market`-Abfrageparameter |
| `404`      | Shop nicht gefunden                 |

## Live Stock prüfen

Prüfen Sie vor dem Checkout, ob eine oder mehrere SKUs aktuell in der angefragten Menge verfügbar sind.

```bash theme={null}
POST /v2/public-api/products/{shop_identifier}/live-stock
```

<ParamField path="shop_identifier" type="string" required>
  Eindeutiger Bezeichner für den Shop
</ParamField>

**Erforderliche Berechtigung:** `product:read`

<Note>
  Live Stock wird gegen den aktuell verfügbaren Shopify-Bestand der zugeordneten Produktvarianten geprüft. Darin enthalten sind Bestände, die bereits durch Shopify-Bestellungen und Draft-Order-Reservierungen gehalten werden.
</Note>

### Anfragekörper

```json theme={null}
[
  {
    "sku_uid": "sku-456",
    "quantity": 2
  },
  {
    "sku_uid": "sku-789",
    "quantity": 1
  }
]
```

| Feld       | Typ     | Erforderlich | Beschreibung                                |
| ---------- | ------- | ------------ | ------------------------------------------- |
| `sku_uid`  | string  | Ja           | SKU-UID aus dem Produktkatalog              |
| `quantity` | integer | Ja           | Zu prüfende Menge. Muss mindestens `1` sein |

Jede `sku_uid` darf pro Live-Stock-Anfrage nur einmal vorkommen.

### Beispielanfrage

```bash theme={null}
curl -X POST "https://api.rxscale.com/v2/public-api/products/my-shop/live-stock" \
  -H "X-API-Key: your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "sku_uid": "sku-456",
      "quantity": 2
    }
  ]'
```

### Antwort bei Verfügbarkeit

Wenn alle angefragten Mengen verfügbar sind, gibt der Endpoint `200 OK` zurück.

```json theme={null}
{
  "available": true,
  "lines": [
    {
      "sku_uid": "sku-456",
      "quantity": 2,
      "available": true,
      "available_stock": 12
    }
  ]
}
```

### Antwort bei fehlender Verfügbarkeit

Wenn mindestens eine angefragte Menge nicht verfügbar ist, gibt der Endpoint `409 Conflict` zurück.

```json theme={null}
{
  "available": false,
  "lines": [
    {
      "sku_uid": "sku-456",
      "quantity": 2,
      "available": false,
      "available_stock": 1
    }
  ]
}
```

### Antwortfelder

| Feld                      | Typ     | Beschreibung                                            |
| ------------------------- | ------- | ------------------------------------------------------- |
| `available`               | boolean | `true` nur, wenn alle angefragten Mengen verfügbar sind |
| `lines[].sku_uid`         | string  | Angefragte SKU-UID                                      |
| `lines[].quantity`        | integer | Angefragte Menge                                        |
| `lines[].available`       | boolean | Ob diese SKU ausreichend Bestand hat                    |
| `lines[].available_stock` | integer | Aktuell verfügbarer Bestand der SKU im Shop             |

### Fehlerantworten

| Statuscode | Beschreibung                                                  |
| ---------- | ------------------------------------------------------------- |
| `400`      | Body-Validierung fehlgeschlagen oder doppelte `sku_uid`-Werte |
| `404`      | Shop oder SKU nicht gefunden                                  |
| `409`      | Mindestens eine angefragte Menge ist nicht verfügbar          |

## Produkte reservieren

Erstellen Sie einen Shopify-Bestellentwurf mit einer Bestandsreservierung für 24 Stunden, bevor Rezepte vorliegen. Verwenden Sie die zurückgegebene Draft-Order-ID später als `reserved_draft_order_id`, wenn Sie signierte Rezepte hochladen.

```bash theme={null}
POST /v2/public-api/products/{shop_identifier}/reservation
```

<ParamField path="shop_identifier" type="string" required>
  Eindeutiger Bezeichner für den Shop
</ParamField>

**Erforderliche Berechtigung:** `create_prescription_checkout`

<Note>
  Die Reservierungsanfrage enthält keine Rezepte und keine Patientendaten. RxScale ergänzt Telemedizin-Anbieter-Attribute automatisch anhand des API-Keys.
</Note>

<Warning>
  Der API-Key muss mit einem Telemedizin-Anbieter verknüpft sein. Anfragen mit einem nicht-telemedizinischen API-Key werden mit `400 Bad Request` abgelehnt, bevor Bestand reserviert wird, da der resultierende Bestellentwurf beim späteren Rezept-Upload nicht zugeordnet werden könnte.
</Warning>

### Anfragekörper

```json theme={null}
{
  "external_reservation_id": "caller-reservation-123",
  "lines": [
    {
      "sku_uid": "sku-456",
      "quantity": 1
    }
  ]
}
```

| Feld                      | Typ     | Erforderlich | Beschreibung                                                                                       |
| ------------------------- | ------- | ------------ | -------------------------------------------------------------------------------------------------- |
| `external_reservation_id` | string  | Nein         | Ihre Reservierungs-ID. Wird am Shopify-Bestellentwurf gespeichert und in der Antwort zurückgegeben |
| `lines`                   | array   | Ja           | Zu reservierende Produkte                                                                          |
| `lines[].sku_uid`         | string  | Ja           | SKU-UID aus dem Produktkatalog                                                                     |
| `lines[].quantity`        | integer | Ja           | Zu reservierende Menge                                                                             |

Jede `sku_uid` darf pro Reservierungsanfrage nur einmal vorkommen. Doppelte SKU-Zeilen werden abgelehnt, weil der spätere Rezept-Upload jede reservierte Draft-Order-Zeile eindeutig zuordnen muss.

### Beispielanfrage

```bash theme={null}
curl -X POST "https://api.rxscale.com/v2/public-api/products/my-shop/reservation" \
  -H "X-API-Key: your-api-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "external_reservation_id": "caller-reservation-123",
    "lines": [
      {
        "sku_uid": "sku-456",
        "quantity": 1
      }
    ]
  }'
```

### Antwort

```json theme={null}
{
  "status": "success",
  "external_reservation_id": "caller-reservation-123",
  "draft_order": {
    "id": "123",
    "invoiceUrl": "https://example.myshopify.com/invoice/...",
    "reserve_inventory_until": "2026-05-16T17:20:00Z"
  }
}
```

`draft_order.id` ist die Shopify Legacy-DraftOrder-ID, nicht die Shopify-GID. Übergeben Sie diesen Wert nach der Signatur der Rezepte als `reserved_draft_order_id` an `POST /v2/public-api/prescriptions/{shop_identifier}`.

### Fehlerantworten

| Statuscode | Beschreibung                                                                                                              |
| ---------- | ------------------------------------------------------------------------------------------------------------------------- |
| `400`      | API-Key ist nicht mit einem Telemedizin-Anbieter verknüpft, Body-Validierung fehlgeschlagen oder doppelte `sku_uid`-Werte |
| `404`      | Shop oder SKU nicht gefunden                                                                                              |
