# Merchant Onboarding API (/fr/platform-api/merchant_onboarding)





Toutes les requêtes de cette page utilisent votre Server Secret Token. Voir [Authentification](/platform-api#authentication).

<Callout title="Un seul onboarding pour les paiements en magasin et en ligne" type="info">
  Un commerçant peut demander l’[Acceptation des paiements en magasin](/in-store), les [Paiements en ligne](/online), ou les deux, dans une seule demande d’onboarding. Cette page s’applique à toutes les intégrations : l’Accept SDK, l’application Tapaya Terminal et
  le Checkout. Utilisez-la pour créer et gérer des commerçants via l’API plutôt que via la Tapaya Platform UI. Demandez les fonctionnalités de paiement dont le commerçant a besoin. Une approbation pour les paiements en magasin ne suffit pas à elle seule à activer les paiements en ligne.
</Callout>

Créer un commerçant avec `POST /integrator/merchant`, ou avec `POST /merchant/auth/register` dans une
[intégration de l’Accept SDK](/in-store/integration/backend_integration#merchant-authentication-accept-sdk-integrations),
crée son compte, mais le commerçant ne peut pas traiter de paiements réels en magasin ou en ligne tant que l’onboarding n’est pas terminé.
Pour les paiements en ligne, demandez la fonctionnalité Checkout et attendez l’approbation du processeur en ligne et la configuration de la passerelle. Les commerçants apparaissent automatiquement dans les [paramètres du Checkout](/online/integration/checkout_settings), où vous pouvez vérifier qu’ils sont prêts et configurer les clés et les portefeuilles. Tapaya prend en charge plusieurs expériences d’onboarding ; toutes peuvent être gérées depuis la Tapaya Platform UI et automatisées lorsque c’est pertinent.

| Parcours                   | Quand l’utiliser                                                                                                | Point d’entrée de l’API                                                                                                                                                                                                                            |
| -------------------------- | --------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Tapaya Platform UI**     | Votre équipe opérationnelle effectue l’onboarding au nom du commerçant.                                         | Créez ou sélectionnez le commerçant dans la Tapaya Platform UI et ouvrez-y l’onboarding hébergé.                                                                                                                                                   |
| **Votre propre interface** | Vous collectez et validez les informations d’onboarding dans votre produit.                                     | Validez les sections avec `POST /integrator/merchant/onboarding/validate/*`, puis soumettez avec `POST /integrator/merchant/onboarding`. Détails ci-dessous.                                                                                       |
| **Invitation par e-mail**  | Un commerçant connu reçoit une invitation à usage unique pour effectuer lui-même son onboarding.                | Envoyez une invitation avec `POST /integrator/merchant/send-registration-invite` ; incluez `merchantToken` pour rattacher l’invitation à une fiche commerçant de base existante, puis listez-la ou révoquez-la via `/integrator/merchant/invites`. |
| **Lien de campagne**       | Plusieurs commerçants, ou des commerçants pas encore connus, utilisent un lien d’auto-inscription réutilisable. | Créez un lien avec `POST /integrator/merchant/reusable-registration-invites` ; listez ou révoquez les liens via la même ressource.                                                                                                                 |

Pour une comparaison détaillée de ces parcours, consultez le [guide d’onboarding des commerçants](/merchants/onboarding).

## Demander les fonctionnalités de paiement en ligne [#request-online-payment-capabilities]

`POST /integrator/merchant/onboarding` exige `capability`. Utilisez la même fonctionnalité lors de la validation du profil d’entreprise :

| Valeur | Fonctionnalité        | Informations par canal                                                            |
| ------ | --------------------- | --------------------------------------------------------------------------------- |
| `1`    | Les deux (Both)       | Fournissez `terminal` et `online`. Chaque canal nécessite sa propre approbation.  |
| `2`    | Terminaux (Terminals) | Fournissez `terminal` pour les paiements en magasin.                              |
| `3`    | Checkout              | Fournissez `online` pour les paiements en ligne. Aucun terminal n’est nécessaire. |

Pour le Checkout, ajoutez les champs de premier niveau suivants en plus de l’identité, de l’adresse, de l’objet partagé `business` et des données KYB du commerçant. Les mêmes champs de canal s’appliquent à `POST /integrator/merchant/onboarding/validate/business` :

```json
{
	"capability": 3,
	"online": {
		"mcc": "5411",
		"statementDescriptor": "ACME CORP",
		"productDescription": "Groceries sold online",
		"averageItemValue": 2500,
		"expectedMonthlyTurnover": 500000,
		"url": "https://www.acme.example.com",
		"purchaseChargeTiming": 1,
		"averageDeliveryDays": 2,
		"topCountries": [{ "countryId": 1, "percentage": 100 }]
	}
}
```

Les montants sont exprimés dans la plus petite unité de la devise. Le site web en ligne doit utiliser HTTP ou HTTPS et son nom d’hôte doit contenir `www`. `statementDescriptor` compte de 5 à 22 caractères. `purchaseChargeTiming` vaut `1` pour une commande passée, `2` pour une commande expédiée ou `3` pour une commande reçue. `averageDeliveryDays` est compris entre 0 et 999. Fournissez de un à quatre `topCountries` uniques dont la somme des pourcentages est égale à 100.

Conservez les informations partagées de support et financières dans `business`. En mode sections par canal, placez le MCC, le libellé de relevé bancaire, la description des produits et les estimations de transactions dans l’objet `terminal` ou `online` concerné. Validez le payload avant de soumettre l’onboarding et corrigez les erreurs de champ propres à chaque canal qui sont renvoyées.

## Inviter un commerçant à effectuer l’onboarding hébergé [#invite-a-merchant-to-complete-hosted-onboarding]

Utilisez ce parcours lorsque Tapaya doit héberger le formulaire KYB, mais que vous souhaitez tout de même contrôler la création du commerçant depuis votre
backend.

<Callout title="Recommandé si vous gérez le merchantToken" type="info">
  Si votre système gère l’identifiant du commerçant utilisé ensuite par le SDK ou votre back-office, créez d’abord la fiche
  commerçant de base avec `POST /merchant/auth/register` ou `POST /integrator/merchant`, puis appelez
  `POST /integrator/merchant/send-registration-invite` avec le même `merchantToken`. L’onboarding hébergé reste ainsi
  rattaché à ce commerçant au lieu d’en créer un second.
</Callout>

La séquence recommandée est la suivante :

1. Créez la fiche commerçant de base :
   * `POST /merchant/auth/register`, ou
   * `POST /integrator/merchant`
2. Envoyez l’invitation à l’onboarding hébergé avec `POST /integrator/merchant/send-registration-invite`
3. Partagez si nécessaire la `registrationUrl` renvoyée avec le commerçant, et laissez-le remplir le formulaire hébergé par Tapaya
4. Interrogez régulièrement l’état de préparation du commerçant via `GET /integrator/merchant/{merchantId}/status`

**Endpoint :** `POST /integrator/merchant/send-registration-invite`

<CodeBlockTabs defaultValue="curl" groupId="http-client">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="curl">
      cURL
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="curl">
    ```bash
    curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/send-registration-invite' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: REPLACE_ME' \
    -d '{
            "email": "admin@acme.com",
            "merchantToken": "unique_merchant_id_from_your_db"
        }'
    ```
  </CodeBlockTab>
</CodeBlockTabs>

**Paramètres :**

| Champ           | Type     | Obligatoire | Description                                                                                                                                                                                                                                                                   |
| --------------- | -------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `email`         | `string` | ✓           | Adresse e-mail qui doit recevoir le lien vers l’onboarding hébergé.                                                                                                                                                                                                           |
| `merchantToken` | `string` |             | Jeton de commerçant existant auquel rattacher l’invitation. Utilisez-le lorsque vous avez déjà créé la fiche commerçant de base et souhaitez que l’onboarding hébergé complète ce même commerçant. S’il est omis, la finalisation de l’invitation crée un nouveau commerçant. |

**Réponses :**

| Code  | Description                                           |
| ----- | ----------------------------------------------------- |
| `200` | Invitation créée. La réponse inclut `registrationUrl` |
| `400` | Erreur de validation de la requête                    |
| `401` | Non autorisé                                          |
| `404` | Organisation ou commerçant introuvable                |
| `409` | Conflit                                               |

**Corps de la réponse :**

```json
{
    "registrationUrl": "https://platform.tapaya.com/invite-merchant?token=...&merchantToken=unique_merchant_id_from_your_db"
}
```

Tapaya tente également d’envoyer ce lien par e-mail. L’envoi de l’e-mail n’est pas garanti : considérez donc toujours la
`registrationUrl` renvoyée comme la source de vérité pour votre interface et vos outils de support.

<Callout title="Ne confondez pas avec l’invitation d’un utilisateur du commerçant" type="warn">
  `POST /integrator/merchant/{merchantId}/invite` est un parcours différent. Il invite un utilisateur de la plateforme à accéder à un
  compte commerçant déjà existant. Il ne lance **pas** l’onboarding KYB et ne crée ni ne met à jour aucun profil
  de commerçant.
</Callout>

## Soumettre l’onboarding via l’API [#submit-onboarding-through-the-api]

Si vous souhaitez collecter les informations d’onboarding dans votre propre produit au lieu de renvoyer les commerçants vers la Tapaya Platform, soumettez-les directement. Validez chaque section au fur et à mesure que le commerçant la remplit grâce aux endpoints `validate/*` ci-dessous, puis soumettez le tout en un seul appel, qui crée en même temps le commerçant et son profil d’onboarding et l’enregistre auprès du processeur de paiement préféré de votre organisation.

<Callout title="Consentement du commerçant et information sur la confidentialité" type="warn">
  Avant de soumettre des informations d’onboarding via l’API, vous devez obtenir le consentement du commerçant aux
  [Conditions générales de Tapaya pour les intégrateurs](https://tapaya.com/terms) et à la
  [Politique de confidentialité de Tapaya](https://tapaya.com/privacy). Ajoutez à votre formulaire d’onboarding une case à cocher renvoyant vers
  les deux documents, ou faites référence aux documents de Tapaya dans le texte des conditions auxquelles le commerçant consent. Vous devez également
  mentionner Tapaya comme sous-traitant des données dans votre propre politique de confidentialité.
</Callout>

<Callout title="Aucun commerçant créé en cas d’échec" type="warn">
  `POST /integrator/merchant/onboarding` crée le commerçant **et** soumet l’onboarding en un seul appel. Si les
  données d’onboarding sont invalides, il renvoie `422` avec des erreurs au niveau des champs et **aucun commerçant n’est créé** ; il n’y a aucun
  commerçant à l’onboarding inachevé à nettoyer ou à reprendre.
</Callout>

<div className="fd-steps [&_h3]:fd-step">
  ### Valider l’identité [#validate-identity]

  **Endpoint :** `POST /integrator/merchant/onboarding/validate/identity`

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/onboarding/validate/identity' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: REPLACE_ME' \
      -d '{
              "legalName": "Acme Corp s.r.o.",
              "businessTypeId": 2,
              "email": "admin@acme.com",
              "registrationNumber": "12345678",
              "vatNumber": "CZ12345678",
              "incorporationDate": "2018-04-01"
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ                | Type     | Obligatoire | Description                                                                                    |
  | -------------------- | -------- | ----------- | ---------------------------------------------------------------------------------------------- |
  | `legalName`          | `string` | ✓           | Raison sociale de l’entreprise ou nom du titulaire individuel du compte.                       |
  | `businessTypeId`     | `int`    | ✓           | Type d’entité juridique (`BusinessTypeEnum`).                                                  |
  | `email`              | `string` | ✓           | Adresse e-mail de contact.                                                                     |
  | `registrationNumber` | `string` | ✓           | Numéro d’immatriculation officiel de l’entreprise. Les doublons sont vérifiés au sein de votre |
  | organisation.        |          |             |                                                                                                |
  | `vatNumber`          | `string` |             | Numéro de TVA, le cas échéant.                                                                 |
  | `incorporationDate`  | `date`   |             | Date de constitution légale de l’entreprise (`YYYY-MM-DD`).                                    |

  **Corps de la réponse :**

  ```json
  {
      "valid": true,
      "errors": []
  }
  ```

  Un `registrationNumber` déjà utilisé par un autre commerçant de votre organisation est renvoyé sous forme d’erreur `valid: false`
  avec `code: "DUPLICATE_REGISTRATION_NUMBER"` plutôt que sous forme de `409` ; cet endpoint renvoie toujours `200`.

  ### Valider l’adresse [#validate-address]

  **Endpoint :** `POST /integrator/merchant/onboarding/validate/address`

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/onboarding/validate/address' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: REPLACE_ME' \
      -d '{
              "line1": "Wenceslas Square 1",
              "city": "Prague",
              "postalCode": "11000",
              "countryId": 1
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ        | Type     | Obligatoire | Description                                          |
  | ------------ | -------- | ----------- | ---------------------------------------------------- |
  | `line1`      | `string` | ✓           | Première ligne de l’adresse postale.                 |
  | `line2`      | `string` |             | Deuxième ligne de l’adresse postale, le cas échéant. |
  | `city`       | `string` | ✓           | Nom de la ville.                                     |
  | `postalCode` | `string` | ✓           | Code postal.                                         |
  | `state`      | `string` |             | État ou région, le cas échéant.                      |
  | `countryId`  | `int`    | ✓           | Pays (`CountryEnum`).                                |

  **Corps de la réponse :** même structure `{valid, errors}` que pour [Valider l’identité](#validate-identity).

  ### Valider le profil d’entreprise [#validate-business-profile]

  **Endpoint :** `POST /integrator/merchant/onboarding/validate/business`

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/onboarding/validate/business' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: REPLACE_ME' \
      -d '{
              "capability": 2,
              "mcc": "5411",
              "url": "https://acme.example.com",
              "supportPhone": "+420123456789",
              "statementDescriptor": "ACME CORP"
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ                     | Type     | Obligatoire | Description                                                                                                                                                             |
  | ------------------------- | -------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `capability`              | `int`    | ✓           | Utilisez la fonctionnalité que vous soumettrez pour l’onboarding. Pour Checkout ou Both, fournissez les [informations par canal](#request-online-payment-capabilities). |
  | `mcc`                     | `string` | ✓           | Merchant Category Code à quatre chiffres. En mode sections par canal, utilisez `terminal.mcc` ou `online.mcc`.                                                          |
  | `url`                     | `string` |             | URL du site web de l’entreprise. `url` ou `productDescription` est obligatoire.                                                                                         |
  | `productDescription`      | `string` |             | Description des produits ou services. `url` ou `productDescription` est                                                                                                 |
  | obligatoire.              |          |             |                                                                                                                                                                         |
  | `supportPhone`            | `string` | ✓           | Numéro de téléphone du service client, au format E.164.                                                                                                                 |
  | `statementDescriptor`     | `string` | ✓           | Texte affiché sur les relevés bancaires des clients (1 à 22 caractères).                                                                                                |
  | `averageItemValue`        | `long`   |             | Valeur moyenne d’une transaction, dans la plus petite unité de la devise.                                                                                               |
  | `expectedMonthlyTurnover` | `long`   |             | Chiffre d’affaires mensuel prévu, dans la plus petite unité de la devise.                                                                                               |
  | `numberOfEmployees`       | `int`    |             | Nombre de salariés de l’entreprise.                                                                                                                                     |
  | `annualTurnover`          | `long`   |             | Chiffre d’affaires annuel, dans la plus petite unité de la devise.                                                                                                      |
  | `balanceSheetTotal`       | `long`   |             | Total du bilan, dans la plus petite unité de la devise.                                                                                                                 |

  **Corps de la réponse :** même structure `{valid, errors}` que pour [Valider l’identité](#validate-identity).

  ### Valider le KYB [#validate-kyb]

  **Endpoint :** `POST /integrator/merchant/onboarding/validate/kyb`

  Fournissez exactement l’un des deux objets : `individual` (entrepreneur individuel / indépendant) ou `company`. Pour une `company`, listez chaque
  propriétaire, dirigeant et signataire autorisé dans `people`.

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/onboarding/validate/kyb' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: REPLACE_ME' \
      -d '{
              "businessTypeId": 2,
              "bankAccount": {
                  "iban": "CZ6508000000192000145399",
                  "bic": "GIBACZPX",
                  "currencyId": 1,
                  "beneficiaryName": "Acme Corp s.r.o."
              },
              "company": {
                  "name": "Acme Corp s.r.o.",
                  "registrationNumber": "12345678",
                  "people": [
                      {
                          "email": "jane@acme.com",
                          "firstName": "Jane",
                          "lastName": "Doe",
                          "role": {
                              "isOwner": true,
                              "isAuthorizedSignatory": true
                          }
                      }
                  ]
              }
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ                                                                                              | Type     | Obligatoire | Description                                                                                                            |
  | -------------------------------------------------------------------------------------------------- | -------- | ----------- | ---------------------------------------------------------------------------------------------------------------------- |
  | `businessTypeId`                                                                                   | `int`    |             | Type d’entité juridique (`BusinessTypeEnum`) ; détermine si les champs `individual` ou                                 |
  | `company` sont obligatoires.                                                                       |          |             |                                                                                                                        |
  | `bankAccount`                                                                                      | `object` |             | Compte bancaire de versement (numéro de compte/IBAN + BIC, devise, bénéficiaire et adresse de la                       |
  | banque).                                                                                           |          |             |                                                                                                                        |
  | `individual`                                                                                       | `object` |             | Informations sur le propriétaire individuel, pour les entrepreneurs individuels. Mutuellement exclusif avec `company`. |
  | `company`                                                                                          | `object` |             | Informations sur la société, dont un tableau `people` des propriétaires, dirigeants et signataires                     |
  | autorisés, ainsi qu’un `verificationDocument` facultatif. Mutuellement exclusif avec `individual`. |          |             |                                                                                                                        |

  Chaque personne de `people` (et `individual`) porte les indicateurs `role.isOwner` / `isDirector` / `isRepresentative` /
  `isAuthorizedSignatory`, ainsi que des champs d’identité facultatifs (`dateOfBirth`, `nationalityCountryId`,
  `officialIdType`/`officialIdNumber`, `address`, `ownershipPercentage`, `verificationDocuments`). Une entrée de personne
  doit être soit sur invitation uniquement, soit entièrement détaillée ; les personnes partiellement renseignées sont refusées. Il existe deux façons de soumettre
  une personne :

  * **Sur invitation uniquement :** soumettez seulement `email` et un `role`. La personne reçoit un e-mail contenant des instructions pour renseigner
    elle-même ses informations personnelles et effectuer directement la vérification de son identité, y compris le téléversement de sa propre pièce d’identité ;
    vous n’avez rien d’autre à collecter pour elle, et aucun téléversement de document n’est requis de votre côté.
  * **Entièrement détaillée :** soumettez vous-même toutes les informations personnelles de la personne (nom, date de naissance, pièce d’identité officielle, adresse,
    etc.). Dans ce cas, vous devez également [téléverser une pièce d’identité](#upload-a-persons-id-document) pour cette
    personne ; c’est obligatoire, et non facultatif, pour chaque personne entièrement détaillée.

  Les documents sont téléversés une fois le commerçant créé, car l’[endpoint de téléversement de
  documents](#upload-a-persons-id-document) a besoin du `merchantId` renvoyé par [Créer un commerçant avec
  onboarding](#create-merchant-with-onboarding). Chaque téléversement est associé à la personne concernée via
  `relatedOfficialIdNumber`. Les champs facultatifs `verificationDocuments.identityDocument`,
  `verificationDocuments.additionalDocument` et `company.verificationDocument` acceptent chacun un objet
  `{frontFileId, backFileId}` et ne peuvent référencer que des fichiers déjà téléversés : omettez-les donc lors de
  la création d’un nouveau commerçant.

  Quel que soit le nombre de personnes sur invitation uniquement ou entièrement détaillées, vous devez toujours [téléverser le document
  d’immatriculation/de constitution de la société](#upload-the-company-document) avant que le commerçant puisse être soumis à l’examen
  KYC.

  **Corps de la réponse :** même structure `{valid, errors}` que pour [Valider l’identité](#validate-identity).

  ### Créer un commerçant avec onboarding [#create-merchant-with-onboarding]

  Soumet en un seul appel tout le contenu des quatre étapes précédentes, crée le commerçant et l’enregistre auprès du
  processeur de paiement préféré de votre organisation.

  **Endpoint :** `POST /integrator/merchant/onboarding`

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/onboarding' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: REPLACE_ME' \
      -d '{
              "name": "Acme Corp",
              "capability": 2,
              "merchantToken": "unique_merchant_id_from_your_db",
              "identity": {
                  "legalName": "Acme Corp s.r.o.",
                  "businessTypeId": 2,
                  "email": "admin@acme.com",
                  "registrationNumber": "12345678",
                  "vatNumber": "CZ12345678"
              },
              "address": {
                  "line1": "Wenceslas Square 1",
                  "city": "Prague",
                  "postalCode": "11000",
                  "countryId": 1
              },
              "business": {
                  "mcc": "5411",
                  "url": "https://acme.example.com",
                  "supportPhone": "+420123456789",
                  "statementDescriptor": "ACME CORP"
              },
              "kyb": {
                  "bankAccount": {
                      "iban": "CZ6508000000192000145399",
                      "bic": "GIBACZPX",
                      "currencyId": 1,
                      "beneficiaryName": "Acme Corp s.r.o."
                  },
                  "company": {
                      "people": [
                          {
                              "email": "jane@acme.com",
                              "firstName": "Jane",
                              "lastName": "Doe",
                              "role": {
                                  "isOwner": true,
                                  "isAuthorizedSignatory": true
                              }
                          }
                      ]
                  }
              }
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ           | Type     | Obligatoire             | Description                                                                                                                                |
  | --------------- | -------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
  | `capability`    | `int`    | ✓                       | `1` pour Both, `2` pour Terminals ou `3` pour Checkout. Voir [fonctionnalités de paiement en ligne](#request-online-payment-capabilities). |
  | `terminal`      | `object` | Selon la fonctionnalité | Informations du canal terminal pour Terminals ou Both.                                                                                     |
  | `online`        | `object` | Selon la fonctionnalité | Informations du canal en ligne pour Checkout ou Both.                                                                                      |
  | `name`          | `string` | ✓                       | Nom du commerçant.                                                                                                                         |
  | `merchantToken` | `string` |                         | Identifiant unique et stable issu de votre système. S’il n’est pas fourni, un jeton aléatoire est                                          |
  | généré.         |          |                         |                                                                                                                                            |
  | `identity`      | `object` | ✓                       | Même structure que pour [Valider l’identité](#validate-identity).                                                                          |
  | `address`       | `object` | ✓                       | Même structure que pour [Valider l’adresse](#validate-address).                                                                            |
  | `business`      | `object` | ✓                       | Même structure que pour [Valider le profil d’entreprise](#validate-business-profile).                                                      |
  | `kyb`           | `object` | ✓                       | Même structure que pour [Valider le KYB](#validate-kyb).                                                                                   |

  **Réponses :**

  | Code  | Description                                                                      |
  | ----- | -------------------------------------------------------------------------------- |
  | `201` | Commerçant créé et onboarding soumis                                             |
  | `422` | Données d’onboarding invalides, voir `errors` ; le commerçant n’est **pas** créé |

  **Corps de la réponse (`201`) :**

  ```json
  {
      "merchantId": "018f8f2a-3b1e-7c2a-9f1a-2e6a1b7c4d3e",
      "merchantToken": "unique_merchant_id_from_your_db",
      "name": "Acme Corp",
      "email": "admin@acme.com",
      "processors": [
          {
              "processorId": 5,
              "registered": true,
              "onboardingUrl": null
          }
      ]
  }
  ```

  `onboardingUrl` est renseigné lorsque le processeur exige que le commerçant suive un parcours d’onboarding hébergé
  supplémentaire (par exemple une vérification d’identité) avant de pouvoir traiter des paiements réels.

  **Corps de la réponse (`422`) :**

  ```json
  {
      "errors": [
          {
              "step": "identity",
              "field": "registrationNumber",
              "message": "A merchant with this registration number is already onboarded under this integrator (merchantId: 018f8f2a-3b1e-7c2a-9f1a-2e6a1b7c4d3e).",
              "code": "DUPLICATE_REGISTRATION_NUMBER"
          }
      ]
  }
  ```

  ### Téléverser la pièce d’identité d’une personne [#upload-a-persons-id-document]

  Obligatoire pour chaque personne entièrement détaillée dans `kyb.company.people` / `kyb.individual` (voir [Valider le
  KYB](#validate-kyb)) ; les personnes sur invitation uniquement téléversent elles-mêmes la leur, via le lien reçu par e-mail.

  **Endpoint :** `POST /integrator/merchant/{merchantId}/document`

  Le corps de la requête est au format `multipart/form-data`, et non JSON.

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/018f8f2a-3b1e-7c2a-9f1a-2e6a1b7c4d3e/document' \
      -H 'Authorization: REPLACE_ME' \
      -F 'paymentProcessorId=5' \
      -F 'documentType=2' \
      -F 'relatedOfficialIdNumber=123456789' \
      -F 'frontFile=@./jane-doe-id-front.jpg' \
      -F 'backFile=@./jane-doe-id-back.jpg'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ                                                                                                                                                                     | Type      | Obligatoire | Description                                                                                                         |
  | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | ----------- | ------------------------------------------------------------------------------------------------------------------- |
  | `paymentProcessorId`                                                                                                                                                      | `int`     | ✓           | Toujours `5`.                                                                                                       |
  | `documentType`                                                                                                                                                            | `int`     | ✓           | Type de document (`DocumentTypeEnum` : `1` Other, `2` Id, `3` Address, `4` Company,                                 |
  | `5` BankStatement, `6` Passport, `7` RecentFinancials).                                                                                                                   |           |             |                                                                                                                     |
  | `frontFile`                                                                                                                                                               | `file`    | ✓           | Recto de l’image du document.                                                                                       |
  | `backFile`                                                                                                                                                                | `file`    |             | Verso de l’image du document, le cas échéant.                                                                       |
  | `relatedOfficialIdNumber`                                                                                                                                                 | `string`  |             | L’`officialIdNumber` de la personne, issu de [Valider le KYB](#validate-kyb).                                       |
  | Obligatoire uniquement lorsque `documentType` est lié à une personne (par exemple Id, Passport, Address) ; ignoré sinon.                                                  |           |             |                                                                                                                     |
  | `submitMerchant`                                                                                                                                                          | `boolean` |             | Laissez-le non défini/à `false` ici : la pièce d’identité d’une personne n’est pas le dernier téléversement du lot. |
  | Ne le définissez à `true` que lors du [téléversement du document de la société](#upload-the-company-document), une fois que les documents de toutes les personnes ont été |           |             |                                                                                                                     |
  | téléversés.                                                                                                                                                               |           |             |                                                                                                                     |

  **Corps de la réponse (`200`) :**

  ```json
  {
      "frontFileId": "file_1NqtHo2eZvKYlo2CZPg8Xt5h",
      "backFileId": "file_1NqtHp2eZvKYlo2CRTg9Xm3k",
      "uploadedAt": "2026-07-17T12:00:00Z"
  }
  ```

  ### Téléverser le document de la société [#upload-the-company-document]

  Obligatoire exactement une fois par commerçant. Si les informations des personnes n’ont pas été renseignées, le signataire autorisé pourra
  téléverser ce document à l’aide du lien figurant dans l’e-mail d’onboarding, et il n’est pas nécessaire d’appeler cet endpoint.

  **Endpoint :** `POST /integrator/merchant/{merchantId}/document`

  Le corps de la requête est au format `multipart/form-data`, et non JSON.

  <CodeBlockTabs defaultValue="curl" groupId="http-client">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="curl">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="curl">
      ```bash
      curl -X 'POST' 'https://api.tapaya.com/integrator/merchant/018f8f2a-3b1e-7c2a-9f1a-2e6a1b7c4d3e/document' \
      -H 'Authorization: REPLACE_ME' \
      -F 'paymentProcessorId=5' \
      -F 'documentType=4' \
      -F 'frontFile=@./acme-corp-register-extract.pdf' \
      -F 'submitMerchant=true'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>

  **Paramètres :**

  | Champ                                               | Type      | Obligatoire | Description                                                                                       |
  | --------------------------------------------------- | --------- | ----------- | ------------------------------------------------------------------------------------------------- |
  | `paymentProcessorId`                                | `int`     | ✓           | Toujours `5`.                                                                                     |
  | `documentType`                                      | `int`     | ✓           | Toujours `4` (`Company`) pour cette étape.                                                        |
  | `frontFile`                                         | `file`    | ✓           | Le document d’immatriculation/de constitution de la société.                                      |
  | `submitMerchant`                                    | `boolean` |             | Définissez-le à `true` pour déclencher l’examen KYC du processeur une fois que tous les documents |
  | requis ont été téléversés. Vaut `false` par défaut. |           |             |                                                                                                   |

  **Corps de la réponse (`200`) :**

  ```json
  {
      "frontFileId": "file_1NqtHo2eZvKYlo2CZPg8Xt5h",
      "backFileId": null,
      "uploadedAt": "2026-07-17T12:00:00Z"
  }
  ```
</div>
