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

# Grants par lot

> Partager plusieurs apps avec plusieurs utilisateurs en un appel. Sémantique matrice, idempotent.

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

Authentification : clé API requise (`Authorization: Bearer <API Key>`).

Ouvrez plusieurs apps que vous possédez à plusieurs utilisateurs en un appel (sémantique matrice, idempotent). Sauter des lignes invalides n’avorte pas le lot ; chaque résultat par paire est renvoyé séparément.

## Requête

### Corps de la requête

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

<ParamField body="usernames" type="string[]" required>
  Liste de noms d’utilisateur.
</ParamField>

### Exemple de requête

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

## Réponse

### 200 succès

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

La charge utile est encapsulée dans `data`. Champs :

<ResponseField name="granted" type="integer" required>
  Nombre de paires de grant nouvellement créées.
</ResponseField>

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

<ResponseField name="apps" type="object[]" required>
  Résultat de traitement par app.

  <Expandable title="champs">
    <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>
  Résultat de résolution par utilisateur.

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

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

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

### Erreurs

| HTTP | `code`         | `category`  | Description                    |
| ---- | -------------- | ----------- | ------------------------------ |
| 401  | `unauthorized` | `forbidden` | Clé API manquante ou invalide. |

Les réponses d’erreur utilisent `{"error": {code, category, message, retryable}}`. Voir <a href="/docs/fr/datahub/api/reference/introduction#errors">Erreurs</a>.

## Bibliothèques clientes

Les SDK Python et JavaScript n’encapsulent pas encore cet endpoint. Appelez REST directement.
