Merchant Onboarding API
Créez des commerçants et soumettez leur onboarding ou invitez-les à l’effectuer via la Platform API de Tapaya.
Toutes les requêtes de cette page utilisent votre Server Secret Token. Voir Authentification.
Un seul onboarding pour les paiements en magasin et en ligne
Un commerçant peut demander l’Acceptation des paiements en magasin, les Paiements en ligne, 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.
Créer un commerçant avec POST /integrator/merchant, ou avec POST /merchant/auth/register dans une
intégration de l’Accept SDK,
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, 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.
Demander les fonctionnalités de paiement en ligne
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 :
{
"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é
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.
Recommandé si vous gérez le merchantToken
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.
La séquence recommandée est la suivante :
- Créez la fiche commerçant de base :
POST /merchant/auth/register, ouPOST /integrator/merchant
- Envoyez l’invitation à l’onboarding hébergé avec
POST /integrator/merchant/send-registration-invite - Partagez si nécessaire la
registrationUrlrenvoyée avec le commerçant, et laissez-le remplir le formulaire hébergé par Tapaya - 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
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"
}'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 :
{
"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.
Ne confondez pas avec l’invitation d’un utilisateur du commerçant
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.
Soumettre l’onboarding via l’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.
Consentement du commerçant et information sur la confidentialité
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 et à la Politique de confidentialité de Tapaya. 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é.
Aucun commerçant créé en cas d’échec
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.
Valider l’identité
Endpoint : POST /integrator/merchant/onboarding/validate/identity
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"
}'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 :
{
"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
Endpoint : POST /integrator/merchant/onboarding/validate/address
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
}'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é.
Valider le profil d’entreprise
Endpoint : POST /integrator/merchant/onboarding/validate/business
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"
}'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. |
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é.
Valider le 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.
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
}
}
]
}
}'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
emailet unrole. 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é 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 a besoin du merchantId renvoyé par Créer un commerçant avec
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é 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é.
Créer un commerçant avec 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
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
}
}
]
}
}
}'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. |
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é. |
address | object | ✓ | Même structure que pour Valider l’adresse. |
business | object | ✓ | Même structure que pour Valider le profil d’entreprise. |
kyb | object | ✓ | Même structure que pour Valider le 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) :
{
"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) :
{
"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
Obligatoire pour chaque personne entièrement détaillée dans kyb.company.people / kyb.individual (voir Valider le
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.
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'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. | |
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é, une fois que les documents de toutes les personnes ont été | |||
| téléversés. |
Corps de la réponse (200) :
{
"frontFileId": "file_1NqtHo2eZvKYlo2CZPg8Xt5h",
"backFileId": "file_1NqtHp2eZvKYlo2CRTg9Xm3k",
"uploadedAt": "2026-07-17T12:00:00Z"
}Téléverser le document de la société
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.
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'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) :
{
"frontFileId": "file_1NqtHo2eZvKYlo2CZPg8Xt5h",
"backFileId": null,
"uploadedAt": "2026-07-17T12:00:00Z"
}