24/7 Support

+237 661562859

Plateforme développeur Camoo

Un client EPP moderne pour PHP

Construisez votre automatisation de domaines sur une base PHP propre et indépendante du framework, conçue pour une connexion directe au registre, des services réutilisables et des intégrations commerciales sécurisées.

Connexion directe au registre · API indépendante du framework · Auto-hébergé

Camoo\Epp $client = new EppClient($config); $client->login(); $client->domainCheck('example.cm'); Connexion directe au registre
Indépendant du frameworkIntégrez-le à des applications PHP, des services et des plateformes personnalisées.
Sécurisé par conceptionTransport EPP TLS, sécurité XML et frontières de licence signée.
Conçu pour les intégrationsUtilisez la même base pour WHMCS, WordPress et vos logiciels personnalisés.

Une base EPP unique

Une API objet claire pour l’infrastructure de domaines

Masquez les détails du protocole registre derrière une API PHP testée et réutilisable au lieu de reconstruire le transport EPP et la gestion XML dans chaque application.

Client et connexion

Sockets TLS bas niveau, trames EPP, connexion, déconnexion, délais d’attente et configuration de connexion.

Opérations de domaine

Flux de vérification, création, mise à jour, renouvellement, transfert et consultation pour les intégrations registre.

Contacts et hôtes

Composants réutilisables pour les contacts, serveurs de noms, files d’attente et SecDNS des services EPP conformes.

Documentation développeur

Une API PHP prévisible pour les opérations de registre

Le package est un client PHP indépendant du framework. Il se connecte directement à un registre EPP via TCP/TLS ; ce n’est pas une API REST et il ne nécessite pas de passerelle HTTP.

Installer

Les clients sous licence reçoivent de Camoo une archive ZIP versionnée et une licence signée séparément. L’archive commerciale ne s’installe pas depuis Packagist public.

Extrayez l’archive, enregistrez son chemin local auprès de Composer, puis exigez la version correspondante.

RELEASE_VERSION="1.0.2"
unzip "camoo-epp-generic-${RELEASE_VERSION}.zip" -d packages
composer config repositories.camoo-epp-generic path "packages/camoo-epp-generic-${RELEASE_VERSION}"
composer require "camoo/epp-generic:${RELEASE_VERSION}" --no-interaction

Configurer

Conservez les identifiants du registrar et les options d’exécution dans des variables d’environnement ou votre gestionnaire de secrets. Les paramètres de licence commerciale sont fournis séparément avec le package sous licence.

Pour les versions commerciales, le nom d’hôte et le port du registre sont intégrés lors de la génération. Votre application fournit les identifiants du registrar et les options d’exécution.

use Camoo\Epp\EppManager;

$client = EppManager::createClient([
    'clid' => getenv('EPP_CLIENT_ID'),
    'password' => getenv('EPP_CLIENT_PASSWORD'),
    'prefix' => 'REG',
    'tls' => true,
    'timeout' => 30,
]);

Paramètres de configuration

Obligatoire signifie que le client ne peut pas se connecter sans cette valeur. Les types sont des types PHP ; les tableaux utilisent la structure indiquée dans le tableau.

Paramètre Type Obligatoire Par défaut Signification
hoststringSelon la version généréeIntégré à la version commercialeNom d’hôte ou adresse IP du registre EPP dans les versions source/test ; les versions commerciales associent cette valeur lors de la génération.
portintSelon la version générée700Port TCP du registre dans les versions source/test ; les versions commerciales associent le port de production lors de la génération.
clidstringOui—Identifiant du registrar/client fourni par le registre.
passwordstringOui—Mot de passe EPP. Conservez-le dans une variable d’environnement ou un gestionnaire de secrets.
prefixstringNonREGPréfixe court du registrar utilisé dans les identifiants de transaction générés.
tlsboolNontrueActive TLS après la connexion TCP. Laissez cette valeur à true pour les registres de production.
timeoutintNon30Délai d’expiration de la connexion et du socket, en secondes.
sslarray<string,mixed>Non[]Options TLS telles que verify_peer, cafile, local_cert et local_pk.
languagestringNonenLangue envoyée dans les options de connexion EPP.
templates_dir?stringNonnullRépertoire contenant les modèles XML du registre pour les variantes spécifiques au registre.
template_namesarray<string,string>Non[]Associe le nom d’une opération au nom de base d’un modèle, par exemple domain_info =&gt; cm_domain_info.
template_valuesarray<string,array>Non[]Valeurs littérales par défaut des paramètres de substitution pour chaque opération.

Paramètres de domaine

Le client utilise des tableaux PHP classiques. N’envoyez pas de XML ici, sauf si une méthode documente explicitement un champ XML brut.

MethodParamètres obligatoiresParamètres facultatifs et types
domainCheck(string|array $domains)$domains: one domain string or list<string>Aucun.
domainInfo(string $domain, ?string $authInfo = null)$domain: domain name$authInfo: ?string, only when the registry requires it
domainCreate(array $params)name: string; registrant: contact handleperiod: int years, default 1; ns: list<string>; contacts: array<string,string>; authInfo: string, generated when omitted
domainRenew(string $domain, string $currentExpiryDate, int $periodYears = 1)$domain: domain name; $currentExpiryDate: YYYY-MM-DD$periodYears: positive int, default 1
domainTransfer(string $domain, string $authInfo, int $periodYears = 1)$domain: domain name; $authInfo: transfer authorization code$periodYears: int, default 1
domainDelete(string $domain)$domain: domain nameAucun.
domainRestore(string $domain)$domain: domain nameAucun.
domainUpdateAuthCode(string $domain, string $authCode)$domain: domain name; $authCode: new authorization codeAucun.
domainUpdateNameservers(string $domain, array $nameservers, array $removeNameservers = [])$domain: domain name; $nameservers: list<string>$removeNameservers: list<string>, default []
domainUpdateStatus(string $domain, string $status, bool $enabled = true, string $reason = '')$domain: domain name; $status: EPP status string$enabled: bool, default true; $reason: string
domainUpdateDnssec(string $domain, array $records, string $action = 'add')$domain: domain name; $records: list<array{keyTag:int,algorithm:int,digestType:int,digest:string}>$action: 'add' or 'rem'
$response = $client->domainCreate([
    'name' => 'example.cm',                 // string, required
    'registrant' => 'REG-CONT-01',          // string, required
    'period' => 1,                           // int, optional; years
    'ns' => ['ns1.example.cm', 'ns2.example.cm'], // list<string>, optional
    'contacts' => [                          // array<string,string>, optional
        'admin' => 'REG-CONT-01',
        'tech' => 'REG-CONT-01',
    ],
    'authInfo' => 'Use-a-strong-code',       // string, optional
]);

Paramètres de contact et d’hôte

Les champs de contact acceptent les noms standard ci-dessous. Les alias Antic indiqués sont également acceptés.

MethodObligatoireFacultatif/par défaut
contactCreate(array $params)name, email, voice or phone, street or address_1, city, cc or ccode: all stringid: string; authInfo: string; org/company, sp/state, pc/zipcode, fax: string; proxied: bool
contactUpdate(array $params)id or handle: stringFriendly fields such as email, phone, city, or raw XML fragments add/rem/chg: string
contactDelete(string $contactId)$contactId: contact handleAucun.
hostCreate(string $host, array $ipAddresses = [])$host: nameserver hostname$ipAddresses: list<string>, IPv4 or IPv6 glue, default []
hostUpdate(string $host, array $addAddresses = [], array $removeAddresses = [])$host: nameserver hostnameBoth address arguments are list<string> and default to []
hostDelete(string $host)$host: nameserver hostnameAucun.
$contact = [
    'name' => 'Example Person',
    'email' => '[email protected]',
    'voice' => '+237600000000',
    'street' => '1 Registry Street',
    'city' => 'Yaounde',
    'cc' => 'CM',
    'org' => 'Example Ltd',             // optional
    'sp' => 'Centre',                    // optional state/province
    'pc' => '00000',                     // optional postal code
];

$response = $client->contactCreate($contact);

Types de valeurs particuliers

Ces structures sont importantes pour implémenter les flux du registre.

list<string>Liste de chaînesExemple : ['ns1.example.cm', 'ns2.example.cm'].
array<string,string>Tableau associatifExemple : ['admin' =&gt; 'REG-CONT-01'].
?stringChaîne nullableUne chaîne ou null. Null signifie « non fourni ».
boolVrai ou fauxUtilisez true/false, et non les chaînes "true"/"false".
intNombre entierLes périodes et les délais sont des entiers, par exemple 1 ou 30.

Signatures complètes des opérations

Toutes les méthodes renvoient EppResponse sauf indication contraire. Utilisez ces signatures comme référence lors de l’intégration du package encodé.

MethodArgumentsObjectif
contactCheck(string|array $contactIds)Un handle de contact ou une list<string>.Vérifier la disponibilité d’un contact.
contactInfo(string $contactId, ?string $authInfo = null)$contactId required; $authInfo optional ?stringLire les détails d’un contact.
hostCheck(string|array $hosts)Un nom d’hôte ou une list<string>.Vérifier la disponibilité d’un serveur de noms.
hostInfo(string $host)$host required stringLire les détails du serveur de noms et des enregistrements glue.
domainUpdateRegistrant(string $domain, string $registrant)Le domaine et le handle de contact sont deux chaînes obligatoires.Modifier le contact titulaire.
domainSuspend(string $domain, string $reason = '')$domain required; $reason optional stringAjoute clientHold.
domainUnsuspend(string $domain, string $reason = '')$domain required; $reason optional stringSupprime clientHold.
domainUpdateTheftProtection(string $domain, bool $enabled)Le domaine est une chaîne ; enabled doit être un vrai booléen.Ajoute ou supprime clientTransferProhibited.
domainUpdateContacts(string $domain, array $old, array $new)$old/$new: maps with optional registrant/admin/tech/billing string keysRemplacer les contacts du domaine en conservant la comparaison ancien/nouveau.
domainChangeSingleHandle(string $domain, string $new, string $old, string $type, string $registrant)Les cinq arguments sont des chaînes obligatoires ; type vaut généralement admin, tech ou billing.Remplacer un handle de contact sur un domaine.
ping()Aucun argument.Envoyer une commande hello EPP.
pollReq()Aucun argument.Demander le prochain message de la file du registre.
pollAck(string $msgId)$msgId required stringAccuser réception de l’identifiant du message de file renvoyé par le registre.
rawXml(string $xml)$xml required stringPoint d’extension avancé pour envoyer une commande EPP complète.

Session

Utilisez une seule session authentifiée pour les opérations liées.

$client->runInSession(function () use ($client): void {
    $client->domainCheck('example.cm');
    $client->domainInfo('example.cm');
});

API de domaine

Couvrez tout le cycle de vie registrar.

$client->domainCheck($domains);
$client->domainCreate($params);
$client->domainRenew($name, $expiry, 1);
$client->domainTransfer($name, $authCode);
$client->domainRestore($name);
$client->domainDelete($name);

API de contacts et d’hôtes

Gérez les contacts, les serveurs de noms, les enregistrements glue et les mises à jour.

$client->contactCreate($contact);
$client->contactUpdate($contact);
$client->contactDelete($contactId);
$client->hostCreate($host, $addresses);
$client->hostUpdate($host, $add, $remove);

Extensions du registre

Utilisez la même API pour DNSSEC, les blocages, la protection contre les transferts, les codes d’autorisation et les mises à jour de confidentialité.

$client->domainUpdateDnssec($name, $dsRecords);
$client->domainSuspend($name, $reason);
$client->domainUpdateTheftProtection($name, true);
$client->domainUpdateAuthCode($name, $authCode);

Contrat de réponse

Chaque commande renvoie EppResponse

Consultez le code et le message du résultat, puis accédez si nécessaire aux identifiants de transaction, au XML brut, aux données filtrées par espace de noms ou aux données normalisées du domaine/contact.

$response = $client->domainInfo('example.cm');

if ($response->isSuccess()) {
    $domain = $response->getDomainInfoData();
    $statuses = $domain['status'] ?? [];
}

$response->getCode();
$response->getMessage();
$response->getClientTransactionId();
$response->getRawXml();
XML spécifique au registre sans créer de fork

Pour les déploiements compatibles Antic, pointez templates_dir vers le bundle de modèles du registre et utilisez template_names pour les variantes telles que cm_domain_info. Les particularités du registre restent ainsi configurables tandis que l’API PHP publique reste stable.

Distribution sous licence

Conçu pour des déploiements de production protégés

Les versions commerciales protègent le cœur de licence et le rattachement au registre avec ionCube. Avant toute connexion au registre, elles vérifient la licence signée et le bail d’utilisation courant. Les clients sous licence reçoivent séparément la documentation de l’API PHP et les instructions de mise à niveau, sans exposer les composants protégés.

Les détails de configuration de la licence sont fournis avec le package sous licence.

Le package commercial est installé sous vendor/camoo/epp-generic. Conservez le fichier epp.license.json signé en dehors de vendor/ et de la racine web publique, de préférence dans /etc/camoo/epp-generic/epp.license.json, puis configurez son chemin absolu avec EPP_LICENSE_FILE.

Conservez le cache du bail de licence de manière persistante et accessible en écriture par l’utilisateur de l’application. Les workers et tâches cron d’une même installation doivent partager le même répertoire de stockage de l’application.

La capacité du bail commercial générique est comptée selon les adresses IP publiques distinctes observées par CAMOO. Les tâches cron partageant le même déploiement et la même IP publique ne consomment pas d’emplacements supplémentaires ; une autre IP publique peut consommer un emplacement disponible. Utilisez EPP_LICENSE_IP uniquement pour une validation hors ligne derrière un NAT ou dans un conteneur.

Plusieurs processus cron partageant le même stockage persistant du package et la même IP publique utilisent la même capacité de bail. Une autre IP publique est comptée séparément selon la capacité IP générique configurée.

Cette page documente le client EPP générique Camoo. Sa licence est distincte de celle d’ANTIC EPP Registrar pour WHMCS, même si le prix et la durée standard sont actuellement identiques.

Interactive API Explorer

OpenAPI 3.1 Specification & Schema Explorer

Parcourez l’index des opérations sans JavaScript, puis téléchargez le contrat OpenAPI complet avec les schémas de paramètres et de réponses. Même si EPP fonctionne sur TCP/TLS, ce contrat OpenAPI rend l’intégration et les tests prévisibles.

Cette référence API fonctionne sans JavaScript externe.

Domains

POST /domains/check Check domain availability (domainCheck)
domainCheck
Signature PHP:
$response = $client->domainCheck(string|array $domains);

Checks if one or multiple domain names are available for registration.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domains string | array<string> Oui — example.cm
POST /domains/info Retrieve domain details (domainInfo)
domainInfo
Signature PHP:
$response = $client->domainInfo(string $domain, ?string $authInfo = null);

Retrieves detailed information about a registered domain, including status codes, registrant, contacts, nameservers, and expiration dates.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
authInfo string Non — Optional authorization code if required by registry for info queries Secr3t!Auth
POST /domains/create Register domain (domainCreate)
domainCreate
Signature PHP:
$response = $client->domainCreate(array $params);

Registers a new domain name with registrant handle, optional nameservers, contacts, and registration period.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
name string Oui — Domain name to register example.cm
registrant string Oui — Registrant contact handle REG-CONT-01
period integer Non 1 Registration period in years 1
ns array<string> Non — Authoritative nameservers ["ns1.example.cm","ns2.example.cm"]
contacts object Non — Additional domain contacts (admin, tech, billing) —
contacts.admin string Non — REG-CONT-01
contacts.tech string Non — REG-CONT-01
contacts.billing string Non — REG-CONT-01
authInfo string Non — Custom authorization password (generated if omitted) RandomStr0ngPass!
POST /domains/renew Renew domain (domainRenew)
domainRenew
Signature PHP:
$response = $client->domainRenew(string $domain, string $currentExpiryDate, int $periodYears = 1);

Renews a domain registration for a specified number of years.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
currentExpiryDate string (date) Oui — Current expiration date formatted as YYYY-MM-DD 2025-01-15
periodYears integer Non 1 1
POST /domains/transfer Transfer domain (domainTransfer)
domainTransfer
Signature PHP:
$response = $client->domainTransfer(string $domain, string $authInfo, int $periodYears = 1);

Requests a domain transfer from another registrar using an authorization code (EPP key).

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
authInfo string Oui — Authorization code (transfer secret) TransferKey!2026
periodYears integer Non 1 1
POST /domains/delete Delete domain (domainDelete)
domainDelete
Signature PHP:
$response = $client->domainDelete(string $domain);

Requests immediate deletion of a domain name.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
POST /domains/restore Restore domain (domainRestore)
domainRestore
Signature PHP:
$response = $client->domainRestore(string $domain);

Requests restoration of a domain in redemption or pending delete period.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
POST /domains/update-nameservers Update domain nameservers (domainUpdateNameservers)
domainUpdateNameservers
Signature PHP:
$response = $client->domainUpdateNameservers(string $domain, array $nameservers, array $removeNameservers = []);

Adds and/or removes authoritative nameservers on a domain.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
nameservers array<string> Oui — Nameservers to add ["ns1.newhost.cm","ns2.newhost.cm"]
removeNameservers array<string> Non — Nameservers to remove ["ns1.oldhost.cm"]
POST /domains/update-contacts Update domain contacts (domainUpdateContacts)
domainUpdateContacts
Signature PHP:
$response = $client->domainUpdateContacts(string $domain, array $old, array $new);

Replaces domain contact handles (admin, tech, billing) using old vs new maps.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
old object Oui — {"admin":"OLD-ADMIN-01"}
new object Oui — {"admin":"NEW-ADMIN-02"}
POST /domains/theft-protection Toggle transfer lock / theft protection (domainUpdateTheftProtection)
domainUpdateTheftProtection
Signature PHP:
$response = $client->domainUpdateTheftProtection(string $domain, bool $enabled);

Adds or removes the clientTransferProhibited status on the domain.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
enabled boolean Oui — True to lock (prohibit transfer), false to unlock true
POST /domains/dnssec Manage DNSSEC SecDNS records (domainUpdateDnssec)
domainUpdateDnssec
Signature PHP:
$response = $client->domainUpdateDnssec(string $domain, array $records, string $action = 'add');

Adds or removes SecDNS delegation signer (DS) records on a domain.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
domain string Oui — example.cm
records array<object> Oui — —
records[].keyTag integer Oui — 12345
records[].algorithm integer Oui — DNSSEC Algorithm (e.g. 8 for RSA/SHA-256, 13 for ECDSA P-256) 13
records[].digestType integer Oui — Digest type (e.g. 2 for SHA-256) 2
records[].digest string Oui — Hexadecimal digest string 49FD46E6C4B45C55D4AC49DA1B7728F6B8660EC3BB3A36E154766C4EB352C6F8
action string Non add add

Contacts

POST /contacts/check Check contact handle availability (contactCheck)
contactCheck
Signature PHP:
$response = $client->contactCheck(string|array $contactIds);

Checks if one or multiple contact identifiers are available.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
contactIds string | array<string> Oui — REG-CONT-01
POST /contacts/info Read contact details (contactInfo)
contactInfo
Signature PHP:
$response = $client->contactInfo(string $contactId, ?string $authInfo = null);

Retrieves full details for a contact handle.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
contactId string Oui — REG-CONT-01
authInfo string Non — —
POST /contacts/create Create contact (contactCreate)
contactCreate
Signature PHP:
$response = $client->contactCreate(array $params);

Registers a new contact object with postal address, voice, and email.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
id string Non — Custom contact handle (auto-generated if omitted) REG-CONT-01
name string Oui — Contact full name Jean Dupont
org string Non — Organization name (optional) Camoo SARL
email string (email) Oui — [email protected]
voice string Oui — Telephone number in ITU format (+CC.NNNNNNNN) +237.600000000
fax string Non — Fax number (optional) +237.600000001
street string Oui — Street address 1 Registry Street
city string Oui — Yaounde
sp string Non — State / Province Centre
pc string Non — Postal code 00000
cc string Oui — Two-letter ISO country code CM
authInfo string Non — Contact authorization code (optional) AuthPass123!
POST /contacts/update Update contact (contactUpdate)
contactUpdate
Signature PHP:
$response = $client->contactUpdate(array $params);

Updates attributes of an existing contact handle.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
id string Oui — Contact handle to update REG-CONT-01
email string Non — [email protected]
voice string Non — +237699999999
city string Non — Douala
POST /contacts/delete Delete contact (contactDelete)
contactDelete
Signature PHP:
$response = $client->contactDelete(string $contactId);

Deletes an unlinked contact handle.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
contactId string Oui — REG-CONT-01

Hosts

POST /hosts/check Check nameserver availability (hostCheck)
hostCheck
Signature PHP:
$response = $client->hostCheck(string|array $hosts);

Checks if one or multiple nameserver hosts exist.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
hosts string | array<string> Oui — ns1.example.cm
POST /hosts/info Read nameserver details (hostInfo)
hostInfo
Signature PHP:
$response = $client->hostInfo(string $host);

Retrieves nameserver host status and associated glue IP addresses.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
host string Oui — ns1.example.cm
POST /hosts/create Create nameserver with glue IPs (hostCreate)
hostCreate
Signature PHP:
$response = $client->hostCreate(string $host, array $ipAddresses = []);

Creates a new nameserver host with optional IPv4 / IPv6 glue records.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
host string Oui — ns1.example.cm
ipAddresses array<string> Non — IPv4 or IPv6 glue addresses ["195.24.205.10","2001:db8::1"]
POST /hosts/delete Delete nameserver (hostDelete)
hostDelete
Signature PHP:
$response = $client->hostDelete(string $host);

Deletes an unused nameserver host.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
host string Oui — ns1.example.cm

Session & Poll

POST /session/ping Send EPP Hello ping (ping)
ping
Signature PHP:
$response = $client->ping();

Sends an EPP <hello frame to test connection liveness.

POST /session/poll-req Request next poll message (pollReq)
pollReq
Signature PHP:
$response = $client->pollReq();

Retrieves the next queued notification message from the registry poll queue.

POST /session/poll-ack Acknowledge poll message (pollAck)
pollAck
Signature PHP:
$response = $client->pollAck(string $msgId);

Acknowledges and removes a message from the registry queue by its message ID.

Paramètres de la requête
Paramètre Type Obligatoire Par défaut Signification Exemple
msgId string Oui — 12345

Conçu pour les équipes produit

Un cœur, plusieurs canaux de distribution

Le client générique sépare le protocole, les services, les licences et l’intégration au framework. Il convient ainsi à un module WHMCS aujourd’hui, puis à une extension WordPress ou une intégration SaaS personnalisée demain.

  • Structure de package PHP 8.1+ PSR-4
  • Validation des licences et baux Ed25519
  • Trafic EPP direct depuis votre infrastructure
  • Services testables au lieu de hooks liés à un framework
Feuille de route d’intégration
01

Bibliothèque PHP générique
Client EPP central et base de gestion des licences

02

Module WHMCS
Intégration registrar ANTIC

03

Extension WordPress
Automatisation de domaines prévue pour l’écosystème WordPress

Construisez avec Camoo

Votre produit a besoin d’une connexion EPP ?

Échangez avec notre équipe au sujet du client générique, d’une intégration registrar WHMCS ou de la future extension WordPress.

Démarrer une conversation