> ## 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.

# Grant in batch

> Condividi più app con più utenti in una call. Semantica a matrice, idempotente.

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

Autenticazione: API key obbligatoria (`Authorization: Bearer <API Key>`).

Apri più app di tua proprietà a più utenti in un'unica chiamata (semantica a matrice, idempotente). Archiviazione e regole di validità sono le stesse della concessione a un singolo utente. Ogni nome utente viene risolto una sola volta. `granted` conta solo le coppie **nuove**; le coppie già presenti nella lista vengono saltate in modo idempotente, così puoi distinguere “3 aggiunte, 2 già presenti”.

## Richiesta

### Body della richiesta

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

<ParamField body="usernames" type="string[]" required>
  Elenco username.
</ParamField>

### Esempio di richiesta

```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"
```

## Risposta

### 200 successo

```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
      }
    ]
  }
}
```

Il payload è wrappato in `data`. Campi:

<ResponseField name="granted" type="integer" required>
  Numero di coppie grant appena create.
</ResponseField>

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

<ResponseField name="apps" type="object[]" required>
  Risultato dell'elaborazione per 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>
  Risultato della risoluzione per utente.

  <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>

### Errori

| HTTP | `code`         | `category`  | Descrizione                    |
| ---- | -------------- | ----------- | ------------------------------ |
| 401  | `unauthorized` | `forbidden` | API key mancante o non valida. |

Le risposte di errore usano `{"error": {code, category, message, retryable}}`. Vedi <a href="/docs/it/datahub/api/reference/introduction#errors">Errori</a>.

## Librerie client

Gli SDK Python e JavaScript non wrappano ancora questo endpoint. Chiama REST direttamente.
