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

# Freigaben stapelweise

> Mehrere Apps mit mehreren Usern in einem Call teilen. Matrix-Semantik, idempotent.

**`POST`** `https://api-datahub.octoparse.com/v1/data-apps/batch/grants`

Authentifizierung: API-Schlüssel erforderlich (`Authorization: Bearer <API Key>`).

Geben Sie mehrere eigene Apps in einem Aufruf für mehrere Benutzer frei (Matrix-Semantik, idempotent). Speicherung und Gültigkeitsregeln entsprechen der Freigabe für einen einzelnen Benutzer. Jeder Benutzername wird einmal aufgelöst. `granted` zählt nur **neue** Paare; bereits auf der Liste stehende Paare werden idempotent übersprungen, sodass Sie „3 hinzugefügt, 2 bereits vorhanden“ unterscheiden können.

## Anfrage

### Anfrage-Body

<ParamField body="app_names" type="string[]" required>
  —
</ParamField>

<ParamField body="usernames" type="string[]" required>
  Username-Liste.
</ParamField>

### Beispielanfrage

```bash theme={null}
curl -X POST \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"apps": ["carol/reviews-query", "carol/product-detail"], "usernames": ["dave", "erin"]}' \
  "https://api-datahub.octoparse.com/v1/data-apps/batch/grants"
```

## Antwort

### 200 Erfolg

```json theme={null}
{
  "data": {
    "granted": 3,
    "skipped": 1,
    "apps": [
      {
        "app": "carol/reviews-query",
        "ok": true
      },
      {
        "app": "carol/product-detail",
        "ok": true
      }
    ],
    "users": [
      {
        "username": "dave",
        "ok": true
      },
      {
        "username": "erin",
        "ok": true
      }
    ]
  }
}
```

Payload ist in `data` gewrappt. Felder:

<ResponseField name="granted" type="integer" required>
  Anzahl neu erstellter Grant-Paare.
</ResponseField>

<ResponseField name="requested" type="integer" required>
  —
</ResponseField>

<ResponseField name="apps" type="object[]" required>
  Verarbeitungsergebnis pro App.

  <Expandable title="fields">
    <ResponseField name="app_name" type="string" required>
      —
    </ResponseField>

    <ResponseField name="ok" type="boolean" required>
      —
    </ResponseField>

    <ResponseField name="code" type="string">
      —
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="users" type="object[]" required>
  Auflösungsergebnis pro Benutzer.

  <Expandable title="fields">
    <ResponseField name="username" type="string" required>
      —
    </ResponseField>

    <ResponseField name="ok" type="boolean" required>
      —
    </ResponseField>

    <ResponseField name="code" type="string">
      —
    </ResponseField>
  </Expandable>
</ResponseField>

### Fehler

| HTTP | `code`         | `category`  | Beschreibung                             |
| ---- | -------------- | ----------- | ---------------------------------------- |
| 401  | `unauthorized` | `forbidden` | Fehlender oder ungültiger API-Schlüssel. |

Fehlerantworten nutzen `{"error": {code, category, message, retryable}}`. Siehe <a href="/docs/de/datahub/api/reference/introduction#errors">Fehler</a>.

## Client-Bibliotheken

Die Python- und JavaScript-SDKs wrappen diesen Endpoint noch nicht. REST direkt aufrufen.
